基于栈比较含退格的字符串

比较含退格的字符串

题目

(1)给定 s 和 t 两个字符串,当它们分别被输入到空白的文本编辑器后,如果两者相等,返回 true 。# 代表退格字符。
(2)注意:如果对空文本输入退格字符,文本继续为空。
(3)示例如下:
输入:s = “ab#c”, t = “ad#c”
输出:true
解释:s 和 t 都会变成 “ac”。

解决思路

  • 用栈s1和t1分别记录对字符串s和t根据要求转换后的结果。
  • 然后逐位比较栈s1和t1对应的字符是否相等。
  • 说明:遇到退格符#后,要删除退格符前面的一个字符,也即弹栈操作。

代码

  • C++代码
# include <stdio.h>
# include <string>
# include <stack>

using namespace std;


class Solution {
public:
    void transform(string S, stack<char> &st) {
        for (int i = 0; i < S.size(); i++) {
            // 遇到退格符,要弹出栈顶元素
            if ('#' == S[i] && !st.empty()) {
                st.pop();
            } else if ('#' != S[i]) {
                // 注意是else if ('#' != S[i])而不是else,如果写成else,则'#' == S[i] && st.empty()时,会将'#'好放入栈st中,从而产生错误。
                st.push(S[i]);
            }
        }
    }

    bool backspaceCompare(string s, string t) {
        stack<char> s1;
        stack<char> t1;

        // 将字符串s按照指定的规则转换后放到栈s1中
        transform(s, s1);
        transform(t, t1);

        if (s1.size() != t1.size()) {
            return false;
        }

        while (!s1.empty()) {
            if (s1.top() != t1.top()) {
                return false;
            }
            s1.pop();
            t1.pop();
        }
        return true;
    }
};


int main() {
    string s = "ab#c";
    string t = "ad#c";
    Solution *solution = new Solution();
    printf("%d\n", solution->backspaceCompare(s, t));
    return 0;
}
  • Python代码
# -*- coding: utf-8 -*-

from typing import List


class Solution:
    def __init__(self):
        pass

    def transform(self, S: str, st: List):
        for i in S:
            # 遇到退格符,要弹出栈顶元素
            if '#' == i and 0 != len(st):
                st.pop()
            # 注意是elif '#' != i而不是else,如果写成else,则'#' == i且st为空时,会将'#'好放入栈st中,从而产生错误。
            elif '#' != i:
                st.append(i)

    def backspaceCompare(self, s: str, t: str) -> bool:
        s1, t1 = [], []     # 使用list存放对字符串转换后的结果

        # 将字符串s按照指定的规则转换后放到s1中
        self.transform(s, s1)
        self.transform(t, t1)

        if len(s1) != len(t1):
            return False

        for i in range(len(s1)):
            if s1[i] != t1[i]:
                return False

        return True


def main():
    solution = Solution()
    s = "ab#c"
    t = "ad#c"
    print(solution.backspaceCompare(s, t))


if __name__ == "__main__":
    main()

说明

  • 对应LeetCode第844题。
  • 链接:https://leetcode-cn.com/problems/backspace-string-compare/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值