标签:int tco ++ for cas OLE 才有 慢慢 i++
字符串题目,一般不考虑暴力解法,因为极有可能会出现超时的情况(主要是重复搜索次数太多
这个题很明显的就是需要我们使用动态规划去做,一开始我自己也懵逼了,三串的DP?难不成要一个三维状态数组吗,但是仔细分析了一下好像其实并不是的。
因为我们s1的长度加s2的长度必定要等于s3的长度才有可能构成交错字符串,所以我们可以利用这里的关系去把三位状态数组压缩成二维。
那么我们把状态定下来之后,就是找对应的转移方程了,其转移也是非常的容易理解,这里要从上往下一个一个判断,因为存在包含关系。
那么我们还需要base cases,因为有可能单独s1或者s2都能匹配s3,所以我们要单独把另外一个字符串为空串的情况拿出来分析。
总的来说这个题的状态转移和其他的字符串匹配很相似,也很容易就写出来了。
class Solution {
public boolean isInterleave(String s1, String s2, String s3) {
if(s1.length() + s2.length() != s3.length()){
return false;
}
boolean[][] dp = new boolean[s1.length()+1][s2.length()+1];
dp[0][0] = true;
for(int i = 0; i < s1.length(); i++){
if(s1.charAt(i) == s3.charAt(i)){
dp[i+1][0] = dp[i][0];
}
}
for(int i = 0; i < s2.length(); i++){
if(s2.charAt(i) == s3.charAt(i)){
dp[0][i+1] = dp[0][i];
}
}
for(int i = 1; i < dp.length; i++){
for(int j = 1; j < dp[i].length; j++){
if(s1.charAt(i-1) == s2.charAt(j-1) && s1.charAt(i-1) == s3.charAt(i+j-1)){
dp[i][j] = dp[i-1][j] || dp[i][j-1];
}else if(s1.charAt(i-1) == s3.charAt(i+j-1)){
dp[i][j] = dp[i-1][j];
}else if(s2.charAt(j-1) == s3.charAt(i+j-1)){
dp[i][j] = dp[i][j-1];
}
}
}
return dp[dp.length-1][dp[0].length-1];
}
}
DP还是得靠自己慢慢摸索才能提升。
标签:int tco ++ for cas OLE 才有 慢慢 i++
原文地址:https://www.cnblogs.com/ZJPaang/p/13334689.html