1、题目描述:
2、题解:
方法1:双指针
设置两个指针 left和right,left指向s,right指向t;
right遍历t,找与s对应相等的值,如果相等那就让left指针向后移动,
遍历结束后,判断left是否等于m。
class Solution:
def isSubsequence(self, s: str, t: str) -> bool:
#双指针
if not s :return True
m,n = len(s),len(t)
left,right = 0,0
while right < n:
if left < m and right < n and s[left] == t[right]:
left += 1
right += 1
return left == m
方法2:动态规划
动态规划问题,弄清楚三点:
1、重复子问题;
2、最优子结构;
3、无后效性。
动态规划:
1、状态定义;
2、状态转移方程;
3、初始化;base case
4、输出;
5、思考状态压缩。
可以用递归去求,但是会存在重叠子问题,加个备忘录可以解决重复问题。
状态定义:
dp[i][j],表示字符串t中从位置i开始往后字符j第一次出现的位置。
状态转移方程:
dp[i][j] = i if ord(t[i]) == j + ord('a') else dp[i+1][j]
Python代码如下:
class Solution:
def isSubsequence(self, s: str, t: str) -> bool:
#动态规划
m,n = len(s),len(t)
dp = [[0] * 26 for _ in range(n)]
dp.append([n] * 26)
for i in range(n - 1,-1,-1):
for j in range(26):
dp[i][j] = i if ord(t[i]) == j + ord('a') else dp[i+1][j]
temp = 0
for i in range(m):
if dp[temp][ord(s[i]) - ord('a')] == n:
return False
temp = dp[temp][ord(s[i]) - ord('a')] + 1
return True
3、复杂度分析:
方法1:
时间复杂度:O(M+N),M、N分别为s和t的长度。
空间复杂度:O(1)
方法2:
时间复杂度:O(M*K + N),K为字符集的长度
空间复杂度:O(M * K)