まず、部分文字列の問題を見ると、dp [s1.length()] [s2.length()]の動的配列を作成するのは簡単です。以下の質問を見てみましょう:
通常のトラバーサルでマークを設定すると、以前に遭遇した状況をマークする方が簡単だと思いました。たとえば、最初のbに遭遇したとき、前の文字が2つのケースがあり、現在の文字が期待される文字と一致する場合、この文字によって生成される状況に前の文字を追加する必要があると判断します。つまり、dp [i] [j] = dp [i-1] [ j-1] + dp [i] [j-1]、一致が失敗した場合、前の文字を考慮せずに、この文字の出現のみを記録します。つまり、dp [i] [j] = dp [ i] [j-1]。次に、状態遷移方程式を見つけ、コードをリストしました。
public int numDistinct(String s, String t) {
int[][] dp=new int[t.length()+1][s.length()+1];
for(int i=0;i<t.length()+1;i++){
for(int j=0;j<s.length()+1;j++){
if(i==0) {
dp[i][j]=1;
continue;
}
if(j==0) {
dp[i][j]=0;
continue;
}
if(s.charAt(j-1)==t.charAt(i-1)){
dp[i][j]=dp[i-1][j-1]+dp[i][j-1];
}
else dp[i][j]=dp[i][j-1];
}
}
return dp[t.length()][s.length()];
}
各行がこの文字の変換状態であるため、毎回Sの文字列をトラバースする必要があることに注意してください。