• 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;
        }
    };
    

  • 相关阅读:
    linux开关机命令
    实现vmare虚拟机系统随主机开机自动启动
    linux常用命令
    centos7.3上用源代码安装zabbix3.2.7
    centos7用yum搭建LAMP环境
    centos7永久更改主机名
    Python基础学习-列表的常用方法
    中兴交换机配置命令
    dml并行
    11.2.0.4 aix下运行第二个节点root.sh报错处理
  • 原文地址:https://www.cnblogs.com/wsl-hitsz/p/13840456.html
Copyright © 2020-2023  润新知