844.比较含退格的字符串

题目链接

给定 s 和 t 两个字符串,当它们分别被输入到空白的文本编辑器后,如果两者相等,返回 true 。# 代表退格字符。

注意:如果对空文本输入退格字符,文本继续为空。

示例1:

  1. 输入:s = "ab#c", t = "ad#c"
  2. 输出:true
  3. 解释:s t 都会变成 "ac"

示例2:

输入:s = "ab##", t = "c#d#"
输出:true
解释:s 和 t 都会变成 ""。

示例 3:

输入:s = "a#c", t = "b"
输出:false
解释:s 会变成 "c",但 t 仍然是 "b"。

提示:

  • 1 <= s.length, t.length <= 200
  • st 只含有小写字母以及字符 '#'

重构字符串

当对字符串进行修改的时候,需要使用 StringBuffer 和 StringBuilder 类

和 String 类不同的是,StringBuffer 和 StringBuilder 类的对象能够被多次的修改,并且不产生新的未使用对象

StringBuffer 线程安全

public StringBuffer append(String s) 将指定的字符串追加到此字符序列。

class Solution {
    public boolean backspaceCompare(String S, String T) {
        return build(S).equals(build(T));
    }

    public String build(String str) {
        StringBuffer ret = new StringBuffer();
        int length = str.length();
        for (int i = 0; i < length; ++i) {
            char ch = str.charAt(i);
            if (ch != '#') {
                ret.append(ch); // 当前字符不是#,将其追加到ret字符串后
            } else {
                if (ret.length() > 0) {
                    ret.deleteCharAt(ret.length() - 1); // 当前字符是#,要在ret最后删除一个字符,完成退格操作
                }
            }
        }
        return ret.toString();
    }
}

双指针

从后往前遍历字符串,可以确定当前字符是否被删除

用skip表示当前待删除的字符的数量,遍历到一个字符时:

  • 若该字符是#,skip++
  • 若该字符不是#
    • skip为0时,当前字符不需要删除
    • skip不为0时,当前字符删除,skip—
class Solution844 {
    public boolean backspaceCompare(String S, String T) {
        int i = S.length() - 1, j = T.length() - 1;
        int skipS = 0, skipT = 0;

        while (i >= 0 || j >= 0) {
            while (i >= 0) {
                if (S.charAt(i) == '#') {
                    skipS++;
                    i--;
                } else if (skipS > 0) {
                    skipS--;
                    i--;
                } else {
                    break;
                }
            }
            while (j >= 0) {
                if (T.charAt(j) == '#') {
                    skipT++;
                    j--;
                } else if (skipT > 0) {
                    skipT--;
                    j--;
                } else {
                    break;
                }
            }
            if (i >= 0 && j >= 0) {
                if (S.charAt(i) != T.charAt(j)) {
                    return false;
                }
            } else {
                if (i >= 0 || j >= 0) {
                    return false;
                }
            }
            i--;
            j--;
        }
        return true;
    }

}