您的位置:首页 > 其它

LeetCode Interleaving String

2015-09-18 05:46 225 查看
原题链接在这里:https://leetcode.com/problems/interleaving-string/

这是一道DP题,用boolean数组dp维护历史数据,dp[i][j]表示长度为i的s1和长度为j的s2能否组成长度为 i+j 的s3.

递推式是若当前s3的最后一个char与s1的最后一个char相同,并且dp[i-1][j]为true, 那么dp[i][j]为true;

或者当前s3的最后一个char与s2的最后一个char相同,并且dp[i][j-1]为true, 那么dp[i][j]为true, 两者是 或 的关系。

初始化第一排时就是s2长度为0时,看s3和s1最后一个char若相同 并且
s1的前一个字符对应的dp是true, 那么返回就是true; 第一列同理。

Note: 1. dp的大小是 (len1+1) * (len2+1). dp[0][0] = true是s1,s2,s3长度都为0的情况。

2. for loop时 i 是 <= 而不是< len1.

3. 初始化第一行第一列时别忘了校验前一个dp的值, 如dp[i-][0].

4. 本题可以使用降维来做。

AC Java:

public class Solution {
public boolean isInterleave(String s1, String s2, String s3) {
if(s3.length() != s1.length()+s2.length()){
return false;
}
int len1 = s1.length();
int len2 = s2.length();
boolean [][] dp = new boolean[len1+1][len2+1];
dp[0][0] = true;
for(int i = 1; i<=len1; i++){   //error
if(s1.charAt(i-1) == s3.charAt(i-1) && dp[i-1][0]){ //error
dp[i][0] = true;
}
}
for(int j = 1; j<=len2; j++){
if(s2.charAt(j-1) == s3.charAt(j-1) && dp[0][j-1]){
dp[0][j] = true;
}
}

for(int i = 1; i<=len1; i++){
for(int j =1; j<=len2; j++){
char c = s3.charAt(i+j-1);
if(c == s1.charAt(i-1) && dp[i-1][j]){
dp[i][j] = true;
}
if(c == s2.charAt(j-1) && dp[i][j-1]){
dp[i][j] = true;
}
}
}
return dp[len1][len2];
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: