一、看题和准备

今天介绍的是LeetCode算法题中Easy级别的第197题(顺位题号是844)。给定两个字符串S和T,如果两个字符串都输入到空文本编辑器中并且相等,则返回true。 #表示退格符。例如:


输入:S =“ab#c”,T =“ad#c”

输出:true

说明:S和T都变为“ac”。


输入:S =“ab ##”,T =“c#d#”

输出:true

说明:S和T都变为“”。


输入:S =“a ## c”,T =“#a#c”

输出:true

说明:S和T都变为“c”。


输入:S =“a#c”,T =“b”

输出:false

说明:S变为“c”而T变为“b”。


注意

  • 1 <= S.length <= 200

  • 1 <= T.length <= 200

  • S和T仅包含小写字母和“#”字符。

跟进:能在O(N)时间和O(1)空间解决它吗?


本次解题使用的开发工具是InteIIiJ IDEA,jdk使用的版本是1.8,环境是win10 64位系统,使用Java语言编写和测试。

二、第一种解法

通过栈的用法,先转换成新的字符串,只不过是使用栈来实现,借助其先进后厨的特性。

先遍历字符串中的字符,如果当前字符不是#号,就入栈;如果遇到#号,就需要回退一个字符,只要将栈顶的元素出栈即可,但是先判断栈中是否包含元素。。

public static  boolean Compare(String S,String T){
        return build(S).equals(build(T));
    }
    public  static  String build(String str){
        Stack<Character> stack = new Stack<>();
        for (char ch:str.toCharArray()
             ) {
            if (ch!='#'){
                stack.push(ch);
            }else if(!stack.isEmpty()){
                stack.pop();
            }
        }
        return String.valueOf(stack);
    }

三、第二种解法

从后向前遍历字符串中的字符,统计遇到的#号个数,直到遇到字母为止,然后累加字符,变成一个新的字符串,另外的同理。

 public static boolean backspaceCompare(String S,String T){
        return rebuild(S).equals(rebuild(T));
    }
    public static String rebuild(String str){
        String newStr = "";
        int count = 0;
        for (int i=str.length()-1;i>=0;i--) {
            char ch = str.charAt(i);
            if(ch=='#'){
                count++;
            }else {
                if(count>0){
                    count--;
                }else{
                    newStr += ch;
                }
            }
        }
        return newStr;
    }

四、第三种解法

  public  static boolean backspaceCompare3(String S,String T){
        int i = S.length()-1,j=T.length()-1;
        while(S.length()-1>=0||T.length()-1>=0){
            i = helper(S,i);
            j = helper(T,j);
            //判断当前的i和j对应的字符串是否相等
            if(i>=0 && j>=0 && S.charAt(i)!=T.charAt(j)){
                return false;
            }
            //如果i或者j小于0时,判断两者是否同时小于0
            if(i<0||j<0){
                return i==j;
            }
            i--;
            j--;
        }
        return true;
    }
    public static int helper(String str,int index){
        int  count = 0;
        while(index>0){
            if(str.charAt(index)=='#'){
                count++;
                index--;
            }else if(count >0){
                count--;
                index--;
            } else {
                break;
            }
        }
        return index;
    }