zoukankan      html  css  js  c++  java
  • 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;
        }
    };
    

  • 相关阅读:
    二分图 洛谷P2055 [ZJOI2009]假期的宿舍
    并查集 洛谷P1640 [SCOI2010]连续攻击游戏
    贪心 洛谷P2870 Best Cow Line, Gold
    贪心 NOIP2013 积木大赛
    快速幂 NOIP2013 转圈游戏
    倍增LCA NOIP2013 货车运输
    树形DP 洛谷P2014 选课
    KMP UVA1328 Period
    动态规划入门 BZOJ 1270 雷涛的小猫
    KMP POJ 2752Seek the Name, Seek the Fame
  • 原文地址:https://www.cnblogs.com/wsl-hitsz/p/13840456.html
Copyright © 2011-2022 走看看