4月30天leetcode训练-Day9

本文探讨了比较含#特殊字符的字符串问题,提出三种解决方案:使用额外数组存储有效字符、迭代器返回有效字符及一未详述方法。重点介绍了迭代器解法,其时间复杂度为O(n),空间复杂度为O(1)。

第9天-Backspace String Compare

问题描述:比较两个字符串是否相等。其中两个字符穿中有“#”非法符号,如遇到这一符号则删除前一个合法字符,最后比较的是两个经过处理后的合法字符。

解法1:设置两个数组存储每个字符串真正有意义的字符,在判断两者是否相等。时间复杂度为O(n);空间复杂度为O(1)

class Day8_Solution_1:
    def backspaceCompare(self, S, T):
        result_S = []
        result_T = []
        for s in S:
            if s!= '#':
                result_S.append(s)
            else:
                if result_S:
                    result_S.pop()
        for t in T:
            if t != '#':
                result_T.append(t)
            else:
                if result_T:
                    result_T.pop()
        return result_S == result_T

上面的代码是我自己第一反应写出来的,但是题中要求不能用额外的空间。所以才有了下面的两个版本的代码:

解法2:leetcode官方给的解答。这个代码基本看懂了,通过一个迭代器返回合法的字符,从后往前遍历字符串,设置一个指针skip记录合法字符前的#个数,如果遇到合法字符,则skip-1,直到skip为0时,当前字符为合法字符,输出到迭代器中。然后比较两个字符串迭代器的输出是否都相等。

def F(S):
    skip = 0
    for x in reversed(S):
        if x == '#':
            skip += 1
        elif skip:
            skip -= 1
        else:
            yield x
def backspaceCompare(S, T):
    return all(x == y for x, y in itertools.zip_longest(F(S), F(T)))

时间复杂度为O(n),空间复杂度为O(1)

还有一个版本没怎么看懂,贴下作者网址,过后再看:

https://www.cnblogs.com/grandyang/p/10447783.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值