1. 题目
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/3e51fd930fbf3fb4e899d41098d5b1c3.png#pic_center)
2. 思路
(1) 动态规划
- dp[i][j]表示字符串t的下标i之后字母j第一次出现的位置。
- 初始化时,令dp[t.length()][i]均为t.length(),然后从后往前进行状态转移。
- 首先将当前下标之后所有字母第一次出现的位置都更新为后一个下标的结果,即dp[i][j]=dp[i+1][j],然后更新当前下标上的字母第一次出现的位置为当前下标,即dp[i][c2[i]-‘a’]=i。
- 最后从头开始确定s中每一个字母在t中出现的顺序。
3. 代码
public class Test {
public static void main(String[] args) {
}
}
class Solution {
public boolean isSubsequence(String s, String t) {
char[] c1 = s.toCharArray();
char[] c2 = t.toCharArray();
int n1 = c1.length;
int n2 = c2.length;
int[][] dp = new int[n2 + 1][26];
for (int i = 0; i < 26; i++) {
dp[n2][i] = n2;
}
for (int i = n2 - 1; i >= 0; i--) {
for (int j = 0; j < 26; j++) {
dp[i][j] = dp[i + 1][j];
}
dp[i][c2[i] - 'a'] = i;
}
int index = 0;
for (int i = 0; i < n1; i++) {
if (dp[index][c1[i] - 'a'] == n2) {
return false;
}
index = dp[index][c1[i] - 'a'] + 1;
}
return true;
}
}