392. 判断子序列

题目:给定字符串 s 和 t ,判断 s 是否为 t 的子序列。
解法:动态规划
思想:使用动态规划的方法实现预处理,解决在t 中找到下一个匹配字符需要的时间,令dp[i][j]表示从第i个位置开始,j出现的第一个位置,从后往前填表
代码:
class Solution {
public boolean isSubsequence(String s, String t) {
int len = t.length();
int[][] dp = new int[len+1][26];
//填表
for(int i=0;i<26;i++){
dp[len][i] = len ; //用len代表正无穷,表示到不了的位置
}
for(int i=len-1;i>=0;i--){
for(int j=0;j<26;j++){
if(j!=(int)(t.charAt(i)-'a')){ //容易出错
dp[i][j] = dp[i+1][j];
} else{
dp[i][j] = i;
}
}
}
//开始判断,i指向子串的位置,j指向主串的位置
int j=0;
for(int i =0;i<s.length();i++){
int pos = dp[j][(int)(s.charAt(i)-'a')];
if(pos==len){
return false;
} else{
j = pos+1;
}
}
return true;
}
}

posted @ 2020-11-15 10:16  for_ward  阅读(126)  评论(0)    收藏  举报