844. Backspace String Compare

56 阅读1分钟

image.png

方法

  • 从后往前便利 *// 我们定义 skip\textit{skip}skip 表示当前待删除的字符的数量。每次我们遍历到一个字符:

// 若该字符为退格符,则我们需要多删除一个普通字符,我们让 skip\textit{skip}skip 加 111;

// 若该字符为普通字符:

// 若 skip\textit{skip}skip 为 000,则说明当前字符不需要删去;

// 若 skip\textit{skip}skip 不为 000,则说明当前字符需要删去,我们让 skip\textit{skip}skip 减 111。

class Solution {
    public boolean backspaceCompare(String s, String t) {
        int i = s.length() - 1, j = t.length() - 1;
        int deleteS = 0, deleteT = 0;
        while (i >= 0 || j >= 0) {
            // 找到 s 中第一个需要比较的字符(去除 # 影响后的第一个待比较字符)
            // 这种写法可以处理 adf#d###df这种累积的#
            while (i >= 0) {
                if (s.charAt(i) == '#') {
                    deleteS++;
                    i--;
                } else if (deleteS > 0) {
                    deleteS--;
                    i--;
                } else {
                    break;
                }
            }

            while (j >= 0) {
                if (t.charAt(j) == '#') {
                    deleteT++;
                    j--;
                } else if (deleteT > 0) {
                    deleteT--;
                    j--;
                } else {
                    break;
                }
            }

            // 这个 if 条件的原因是:如果 index = 0 位置上为 '#',则 i, j 会为 -1
            if (i >= 0 && j >= 0) {
                if (s.charAt(i) != t.charAt(j)) {
                    return false;
                }
            } else {
                if (i >= 0 || j >= 0) {
                    return false;
                }
            }
            // (i >= 0 && j >= 0) 为 false 情况为
            // 1. i < 0 && j >= 0
            // 2. j < 0 && i >= 0
            // 3. i < 0 && j < 0
            // 其中,第 3 种情况为符合题意情况

            i--;
            j--;
        }
        return true;
    }
}