还是想跟大家分享一下我的思路。我觉得这种问题就三个步骤:
1.建dp数组
2.添加初始值
3.找dp[i]和dp[i-1],dp[i-2]之间的关系
多数比较难得dp一般都是dp间关系以及dp的定义不好找。找到后,这种题就会比较好做。
代码
import java.util.*;
class Solution {
public boolean isInterleave(String s1, String s2, String s3) {
if(s3.length() != s1.length()+s2.length()) return false;
int m = s1.length();
int n = s2.length();
boolean[][] dp = new boolean[m+1][n+1];
dp[0][0] = true;
for(int i =1;i<=m;i++){
dp[i][0] = (s1.charAt(i-1)==s3.charAt(i-1) && dp[i-1][0] == true)?true:false;
}
for(int i =1;i<=n;i++){
dp[0][i] = (s2.charAt(i-1)==s3.charAt(i-1) && dp[0][i-1] == true)?true:false;
}
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
if(dp[i-1][j] == false && dp[i][j-1] == false){
dp[i][j] = false;
}else if(dp[i-1][j] == true){
if(s1.charAt(i-1)==s3.charAt(i+j-1)){
dp[i][j] = true;
}else{
dp[i][j] = false;
}
}else if(dp[i][j-1] == true){
if(s2.charAt(j-1)==s3.charAt(i+j-1)){
dp[i][j] = true;
}else{
dp[i][j] = false;
}
}
}
}
return dp[m][n];
}
} 
京公网安备 11010502036488号