Leercode | 844. 比较含退格的字符串

Leetcode 844. 比较含退格的字符串

给定 S 和 T 两个字符串,当它们分别被输入到空白的文本编辑器后,判断二者是否相等,并返回结果。 # 代表退格字符。


示例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. 从哪个index开始删除
2. 删除多少个字符
3. 是否有足够的字母被删除,即‘#’的个数可能比前面的字母个数还要多。
4. 以下代码还有足够的空间可以优化,这个是我一边考虑情况,一边写的,beat 92.3%。

class Solution {
public:
    bool backspaceCompare(string S, string T) {
        if (!S.size() && !T.size())
            return true;
        int count = 0;
        int index = -1;

        for (size_t i = 0; i < S.size(); ++i) {
            if (S[i] == '#') {
                index = count == 0 ? i - 1 : index;     // 记录要从哪里开始删除
                count++;            // 要删除多少个
                // 如果下一个字符不是#,则可以开始删除
                if (S[i + 1] != '#') {
                    // 如果前面字符的个数大于#号的个数
                    if (index + 1 > count) {
                        S.erase(index - count + 1, 2 * count);
                        i = index - count + 1;
                    }
                    else {      // 如果前面字符的个数小于等于#号的个数,则直接删除全部,包括遍历到的目前的#号
                        S.erase(0, i + 1);
                        i = 0;
                    }
                    count = 0;
                }
                else
                    continue;
            }
        }
        count = 0;
        index = -1;
        for (size_t i = 0; i < T.size(); ++i) {
            if (T[i] == '#') {
                index = count == 0 ? i - 1 : index;     // 记录要从哪里开始删除
                count++;            // 要删除多少个
                if (T[i + 1] != '#') {
                    if (index + 1 > count) {
                        T.erase(index - count + 1, 2 * count);
                        i = index - count + 1;
                    }
                    else {
                        T.erase(0, i + 1);
                        i = 0;
                    }
                    count = 0;
                }
                else
                    continue;
            }
        }
        return !S.compare(T);
    }
};

这里写图片描述

猜你喜欢

转载自blog.csdn.net/Gary___/article/details/81738683