字符串--子串匹配
下面给出了子串匹配问题的模板,预处理结束后的代码根据题意编写
dp
预处理目的:得到26个字母在字符串t中首次出现的位置
数组元素表示从从位置 i 开始往后字符 j 第一次出现的位置
class Solution {
public boolean isSubsequence(String s, String t) {
int n = s.length(), m = t.length();
int[][] f = new int[m + 1][26];
for (int i = 0; i < 26; i++) {
f[m][i] = m;
}
for (int i = m - 1; i >= 0; i--) {
for (int j = 0; j < 26; j++) {
if (t.charAt(i) == j + 'a')
f[i][j] = i;
else
f[i][j] = f[i + 1][j];
}
}
//----------------------------预处理结束,现在26个字母在t的位置已经存进数组
int add = 0;
for (int i = 0; i < n; i++) {
//f中a是下标0,b是下标1……,所以s中取出的字母,想转化成f中对应的下标,要 - 'a'
if (f[add][s.charAt(i) - 'a'] == m) {
return false;
}
add = f[add][s.charAt(i) - 'a'] + 1;
}
return true;
}
}
横坐标的每个点代表一个字母