classSolution{// t的后缀二维数组privateint[][] ta =null;publicbooleanisSubsequence(String s,String t){if(ta ==null){init(t.toCharArray());}// 匹配int p =0;if(s.length()> ta.length)returnfalse;for(int i =0; i < s.length(); i++){int c = s.charAt(i)-'a';// 没有匹配到if(ta[p][c]==-1){returnfalse;}// 指针跳跃至刚刚匹配的位置后
p = ta[p][c]+1;}returntrue;}privatevoidinit(char[] t){// 构建t的后缀二维数组(y轴为t的长度,x轴为字母序)// 数组的每一行代表:当前index其后的每个字母最近的位置
ta =newint[t.length +1][26];// 最后一行,先给个初值(意义是最后一个字符后,没有任何一个字符)for(int x =0; x <26; x++){
ta[t.length][x]=-1;}// 从后往前遍历, 记录每个位置的字母for(int y = t.length -1; y >=0; y--){int p = t[y]-'a';for(int x =0; x <26; x++){if(x == p){
ta[y][x]= y;continue;}
ta[y][x]= ta[y+1][x];}}}}