昨天做了几道关于双指针求解的算法题,今天继续看相关的题目。
给定 s 和 t 两个字符串,当它们分别被输入到空白的文本编辑器后,如果两者相等,返回 true 。# 代表退格字符。
注意:如果对空文本输入退格字符,文本继续为空。
示例 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 = "b"
输出:false
解释:s 会变成 "c",但 t 仍然是 "b"。
解题思路:
从题中知道当字符串遇到“#”时,会将当前"#“和其前一位的字符清除。这里使用双指针法求解。
因为遇到”#“是要清空其前一位字符,故这里从后往前遍历。以字符串s为例:定义i为遍历索引,skipS为记录的”#"个数,分为以下三种情况:
- 当s[i] == "#"时,skipS+1,i-1,i继续向前遍历;
- 当s[i] != “#” and skipS >0,此时说明i+1是"#",故应消除当前字符i-1且skipS-1,i继续向前遍历;
- 当s[i] != “#” and skipS == 0,说明i+1不是"#",此时s[i]字符应保留,此时应跳出字符串s的循环,和同样操作的字符串t的索引进行比较。
对于字符串t也同样按照上述方式进行判断,定义j为遍历索引,skipT为记录的"#"个数。当i>=0 and j>=0并且i和j所在索引位置字符都应该保留时,比较s[i]与t[j]是否相等,若不相等,直接返回False,如相等,则继续上述操作。
class Solution:
def backspaceCompare(self, s: str, t: str) -> bool:
i=len(s)-1
j=len(t)-1
skipS=0
skipT=0
while i>=0 or j>=0:
# 字符串s的循环,找到下一个应该被保留的字符索引
while i>=0:
if s[i] == "#":
skipS+=1
i-=1
elif skipS > 0:
skipS-=1
i-=1
else:
# 当s[i] != "#" and skipS == 0
# 跳出当前循环,与下面的t的索引j进行匹配
break
# 字符串t的循环,找到下一个应该被保留的字符索引
while j>=0:
if t[j] == "#":
skipT+=1
j-=1
elif skipT > 0:
skipT-=1
j-=1
else:
# 当t[j] != "#" and skipT == 0
# 跳出当前循环,与索引i进行匹配
break
# 当i和j索引均大于等于0时,判断对应的字符值是否相等
if i>=0 and j>=0:
if s[i]!=t[j]:
return False
# 此时,i或j有一方索引小于0,说明最后得到的两个字符串至少差了一个字符,故肯定不会相等,返回False
elif i>=0 or j>=0:
return False
i-=1
j-=1
return True
这道题力扣上是简单题,但是我想了挺久的也没有做出来,最后是看了题解才明白,因为我最开始是想按照昨天快慢指针的方式,对s和t字符串分别得到新字符串之后,直接比较两个新字符串是否一致就行了,但是最后越写越不对。