387. 比较含退格的字符串

94 阅读1分钟

给定 s 和 t 两个字符串,当它们分别被输入到空白的文本编辑器后,请你判断二者是否相等。# 代表退格字符。

如果相等,返回 true ;否则,返回 false 。

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

示例 1:

输入: s = "ab#c", t = "ad#c"
输出: true
解释: S 和 T 都会变成 “ac”。

示例 2:

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

示例 3:

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

示例 4:

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

 

提示:

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

用StringBuffer:

private static String build(String str){
    StringBuffer sb = new StringBuffer();
    int len = str.length();
    for (int i = 0 ; i < len;i++){
        char ch = str.charAt(i);
        if(ch != '#'){
            sb.append(ch);
        }
        else if(sb.length()>0){
            sb.deleteCharAt(sb.length()-1);
        }
    }
    return sb.toString();
}

双指针:

public static boolean backspaceCompare(String s, String t) {
    int i = s.length() - 1;
    int j = t.length() - 1;
    int skipi = 0;
    int skipj = 0;
    while (i >= 0 || j >= 0){
        while (i>=0){
            char ch = s.charAt(i);
            if(ch == '#'){
                skipi++;
                i--;
            }
            else {
                if(skipi >0 ){
                    skipi--;
                    i--;
                } else {
                    break;
                }
            }
        }
        while (j>=0){
            char ch = t.charAt(j);
            if(ch == '#'){
                skipj++;
                j--;
            }
            else {
                if(skipj >0 ){
                    skipj--;
                    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;
}