844. 比较含退格的字符串

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

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

输入: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”。

我的解法

class Solution {
public:
    bool backspaceCompare(string S, string T) {
        back(S);
        back(T);
        return S == T;
    }
    void back(string& S){
        int n = S.size();
        for(int i = 1; i <n ; i++){
            if (S[i] == '#'){
                int j = i;
                while (j>=1 && S[j-1] == '#')
                    j--;
                if (j-1 >= 0)
                    S[j-1] = '#';
            }
        }
        int index = 0;
        while (index < S.size()){
            if (S[index] == '#'){
                S.erase(S.begin() + index);
            }else{
                index++;
            }
        }
        return;
    }
};

使用stack自左向右的模拟

class Solution {
public:
    bool backspaceCompare(string S, string T) {
        string s; // 当栈来用
        string t; // 当栈来用
        for (int i = 0; i < S.size(); i++) {
            if (S[i] != '#') s += S[i];
            else if (!s.empty()){
                s.pop_back();
            }
        }
        for (int i = 0; i < T.size(); i++) {
            if (T[i] != '#') t += T[i];
            else if (!t.empty()) {
                t.pop_back();
            }
        }
        if (s == t) return true; // 直接比较两个字符串是否相等,比用栈来比较方便多了
        return false;
    }
};

自右向左的双指针模拟

class Solution {
public:
    bool backspaceCompare(string S, string T) {
        int sSkipNum = 0; // 记录S的#数量
        int tSkipNum = 0; // 记录T的#数量
        int i = S.size() - 1;
        int j = T.size() - 1;
        while (1) {
            while (i >= 0) { // 从后向前,消除S的#
                if (S[i] == '#') sSkipNum++;
                else {
                    if (sSkipNum > 0) sSkipNum--;
                    else break;
                }
                i--;
            }
            while (j >= 0) { // 从后向前,消除T的#
                if (T[j] == '#') tSkipNum++;
                else {
                    if (tSkipNum > 0) tSkipNum--;
                    else break;
                }
                j--;
            }
            // 后半部分#消除完了,接下来比较S[i] != T[j]
            if (i < 0 || j < 0) break; // S 或者T 遍历到头了
            if (S[i] != T[j]) return false;
            i--;j--;
        }
        // 说明S和T同时遍历完毕
        if (i == -1 && j == -1) return true;
        return false;
    }
};

844. 比较含退格的字符串

原文链接: https://www.cnblogs.com/wsl-hitsz/p/13840456.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍;

也有高质量的技术群,里面有嵌入式、搜广推等BAT大佬

    844. 比较含退格的字符串

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/397440

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年4月10日 上午9:32
下一篇 2023年4月10日 上午9:32

相关推荐