算法:笔记草稿消除“(“ , “)“ 和 “<“

题目描述:

薯队长写了一篇笔记草稿,请你帮忙输出最后内容。

 1.输入字符包括,"("    ,    ")"    和    "<"和其他字符。 

2.其他字符表示笔记内容。

 3.()之间表示注释内容,任何字符都无效。    括号保证成对出现。

 4."<"表示退格,    删去前面一个笔记内容字符。括号不受"<"影响    。

输入描述:

输入一行字符串。长度<=10000.

输出描述:

输出一行字符串,表示最终的笔记内容。 

输入例子1:

Corona(Trump)USA<<

输出例子1:

CoronaVirus

 思路分析:

看起来比较简单,但还是有很多坑的

 a(12345678909987654321234567890987654321)bkdasgtj

abkdas(sd<

这几个就比较坑的例子

第一个是连续的<<<<<<

第二个是(a(b)c)d  ;一不小心就会把(b 消掉,导致最后的)括号找不到匹配

第三个导致只能先消括号,在消除<<;其实也可以一起消除


  1. 消除括号

遍历字符串,遇到 ( 放入栈中,遇到 ) 就开始从栈里弹出一个 ( 的下标,删除这两个左右括号及他们之间的字符。此时删除之后,字符串变了,仍然遍历的话是不行的,就需要调整循环i的位置:如果栈不为空,调整到栈里的最顶上的 ( 的位置开始搜索;如果栈为空,就从刚才删除的字符串的( 原来的下标开始搜索

     2. 消除<

遍历字符串,遇到<就开始删除,<之前不是<就将之前的字符串加入stringBuffer2,,如果<<是连续的,就进入stringBuffer2删除一个字符

代码:

import java.util.Scanner;
import java.util.Stack;



public class Main {
    Scanner scanner = new Scanner(System.in);
    String in(){
        String s = scanner.next();
        return s;
    }

    /**
     * 核心函数
     * @return
     */
    String  note() {


        //解决() 的问题;
        String s= in();
        StringBuffer stringBuffer = new StringBuffer(s);
        Stack stack = new Stack();
        for (int i = 0; i < stringBuffer.length(); i++) {

            if (stringBuffer.charAt(i) == '(') {
                //入栈
                stack.push(i);
            }
            if (stringBuffer.charAt(i) == ')') {

                //弹出
                //弹出的是(的下标
                int p = (int) stack.pop();

                //删除stringbuffer中的()括号内部份
                stringBuffer.delete(p, i + 1);

                //因为此时stringbuffer已经被改变了
                //修改i,stringbuffer的起始搜索位置变为  a(12)34,变为a之后的(下标,此时为a34,即3的位置
                if (!stack.empty())
                {
                    i = (int)stack.peek();
                }else {
                    i = p;
                }
            }

        }
        //输入

        //处理<<<
        StringBuffer stringBuffer2 = new StringBuffer();
        int num = 0;

        for (int i = 0; i <= stringBuffer.length(); i++) {
            if (i == stringBuffer.length() ) {

                //结束了,没有<了
                stringBuffer2.append(stringBuffer.substring(num, stringBuffer.length()));
                break;

            }

            char c = stringBuffer.charAt(i);
            if (c == '<') {


                //遇到<,就添加字符串进入stringbuffer
                if (i - num >= 1) {
                    //添加

                    stringBuffer2.append(stringBuffer.substring(num, i-1));
                } else {
                    //删除一个
                    stringBuffer2.delete(stringBuffer2.length() - 1, stringBuffer2.length());

                }
                num = i + 1;

            }


        }
        return stringBuffer2.toString();

    }
    public static void main(String[] args) {
        String note = new Main().note();

        System.out.println(note);


    }
}

因为消除()和消除<都是遍历字符串,就可以将他们放到一起

package xyz.gsdn.school;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        StringBuffer stringBuffer = new StringBuffer();
        stringBuffer = new StringBuffer(scanner.nextLine());
        List k = new ArrayList<>();
        //用一个列表来装括号的匹配
        //遇见‘(’添加首次匹配位置进去
        //遇见‘)’从最后一次‘(’匹配位置开始删除字符串
        for(int i = 0; i < stringBuffer.length();){
            if(stringBuffer.charAt(i)=='(') {
                k.add(i);
                i++;
            }
            else if(stringBuffer.charAt(i)=='<'&&k.size()==0) {
                stringBuffer.delete(i - 1, i + 1);
                i = i - 1;
            }
            else if(stringBuffer.charAt(i)==')') {
                stringBuffer.delete(k.get(k.size() - 1),i + 1);
                i = k.get(k.size() - 1);
                k.remove(k.size() - 1);
            }
            else {
                i++;
            }
        }
        System.out.println(stringBuffer);
    }
}

 

你可能感兴趣的:(算法,算法)