
方法一 双指针
我们可以通过双指针算法来判断一个串是否能由s串删除某些元素得到。
拿第一个例子来说明: s="abpcplea", d[0]="ale"
- 定义双指针p,q,分别指向s,d[0],计数器count
- 开始遍历:
- 如果匹配成功,比如
s[0] == d[0][0],则p++,q++,count++ - 如果匹配不成功,则
p++
- 如果匹配成功,比如
- 如果最后
count==len(d[0]),说明全部匹配成功。
子串匹配代码
def inStr(i):p = q = count = 0 # 双指针,计数器slen, dlen = len(s), len(d[i]) # s串和子串的长度while p < slen and q < dlen:if s[p] == d[i][q]: # 匹配成功一个字符count += 1q += 1p += 1if count == dlen:return Truereturn False
有了上面的代码,问题就很简单了,每次调用inStr()函数来判断是否为s的”子串”,再更新当前记录的结果。
Python代码
def findLongestWord(self, s: str, d: List[str]) -> str:def inStr(i): # 判断子串函数p = q = count = 0slen, dlen = len(s), len(d[i])while p < slen and q < dlen:if s[p] == d[i][q]:count += 1q += 1p += 1if count == dlen:return Truereturn Falserel = ''for i in range(len(d)):if inStr(i) and len(d[i]) >= len(rel):# 如果该串更长 或者 长度和rel一样但是字典序更靠前, 则更新if len(d[i]) > len(rel) or (len(d[i]) == len(rel) and d[i] < rel):rel = d[i]return rel
时间复杂度O(mn)
两层循环,外层长度为len(d),记为m,内层长度最长为max(len(s),len(d[i])),记为n,m<n,所以时间复杂度为O(mn)
空间复杂度O(x)
这里的s表示结果串rel的长度
