题目意思,#号相当于删除符,当出现#时,需要删除它前面的那个字符,如果出现连续n个#号,那么将删除第一个#前面的n个字符。如果#前面已经没有字符了,那么就不删除了。
直观来看,从后往前遍历,当碰到#号的时候就删除#号前面的字符。当然这里有一些细节
- 当出现多个连续#号的时候,就不是直接删除#号前面的字符了,而是需要记录#号出现的个数,记作num
- 当前字符是#时,num++,当前字符不是#时,判断num是否大于0,如果大于0,说明之前出现过#,那么删除当前字符,并使num–
- python中无法直接对字符串做删除操作,先把字符串转换为列表在进行删除操作
# 遍历了两次,效率有点拉跨
class Solution:
def convert(self, string):
s = list(string) #转成list
pos = len(s) - 1
num = 0
while (pos >= 0): #从后往前遍历
if (s[pos] != '#' and num > 0):
num -= 1
del s[pos] #删除当前字符
elif (s[pos] == '#'):
del s[pos]
num += 1
pos -= 1
return s
def backspaceCompare(self, S: str, T: str) -> bool:
s = self.convert(S)
t = self.convert(T)
if(len(s) != len(t)):
return False
else:
for i in range(0, len(s)):
if(s[i] != t[i]):
return False
return True
上面是第一版的代码,我们发现在删除操作的时候,遍历了S,T字符串一次,然后在比较删除后的字符串是否相等的时候,又遍历了一次,所以总共遍历了两次,时间复杂度有点拉跨。
python类中写function一定要写seft参数,调用的时候也要使用self.function,老是容易忘