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 <= S.length <= 200
1 <= T.length <= 200
S 和 T 只含有小写字母以及字符 ‘#’。

退格有如下的特点:

  • 退格从右往左删除元素
  • 每出现一个退格,则退格字符左边的有效字符就删除一个,如果退格字符左边没有有效字符,则退格无效。

基于以上特点,利用栈的思想实现算法。

  • 用一个新栈存储剩下的字符
  • 讲字符串看成一个栈,根据栈先进后出的特点,如果要模拟输入过程,首先将原字符串栈翻转,原字符串出栈一次,如果是正常字符,就push进新的栈。如果是‘#’代表退格操作。就应该让新栈pop()一次。如果新栈没有数据,则不操作。
  • 循环结束,新栈中的字符串就是最终字符串的翻转。
    下面是程序
class Solution:
    def backspaceCompare(self, S, T):
        """
        :type S: str
        :type T: str
        :rtype: bool
        """
        def tonewseq(seq):
        '''
        输出新的字符串,与实际字符数相比,是翻转的。
        '''
            seq = list(seq[::-1])
            stack = []
            if seq == []:
                return seq
            else:
                for i in  range(len(seq)):
                    char = seq.pop()
                    if char == '#':
                        if stack != []:
                            stack.pop()
                    else:
                        stack.append(char)
            return stack
       
        return tonewseq(S) == tonewseq(T)
                        
                
            

猜你喜欢

转载自blog.csdn.net/qq_20966795/article/details/84981252