https://leetcode.cn/problems/is-subsequence/description/
轉化為最長公共子序列問題。求[lens][j]的公共子序列長度是否為lens。
class Solution {//s屬于t,lens<=lentpublic boolean isSubsequence(String s, String t) {int lens=s.length(),lent=t.length();if(s.length()==0) return true;if(lent<lens) return false;int[][] dp=new int[lens+1][lent+1];//[i][j]:前i個,[0,i-1]。求[lens][j]的公共子序列長度是否為lens//初始化:i為0或者j為0。公共子序列長度都為0//轉化為最長公共子序列問題for(int i=1;i<=lens;i++){for(int j=1;j<=lent;j++){if(s.charAt(i-1)==t.charAt(j-1)){dp[i][j]=dp[i-1][j-1]+1;}else{dp[i][j]=Math.max(dp[i-1][j],dp[i][j-1]);}if(i==lens&&dp[i][j]==lens){return true;}}}return false;}
}
這道題應該算是編輯距離的入門題目,因為從題意中我們也可以發現,只需要計算刪除的情況,不用考慮增加和替換的情況。
if (s[i - 1] == t[j - 1])
t中找到了一個字符在s中也出現了
if (s[i - 1] != t[j - 1])
相當于t要刪除元素,繼續匹配
本題 如果刪元素一定是字符串t,而 1143.最長公共子序列 是兩個字符串都可以刪元素。
class Solution {public boolean isSubsequence(String s, String t) {int len1=s.length();int len2=t.length();int i=0,j=0;int count=0;//=len1while(i<len1&&j<len2){char c1=s.charAt(i);char c2=t.charAt(j);/*while(c1=c2&&i<len1&&j<len2){count++;}*/if(c1==c2){count++;i++;j++;}else{j++;}}return count==len1?true:false;}
}