97. Interleaving String(交错字符串)
程序员文章站
2024-02-21 22:11:58
...
题目链接:https://leetcode.com/problems/interleaving-string/
思路:
一种思路用回溯递归来做,提交成功了,但是时间耗费693ms......
另一种解法用DP:
【动态规划】
假设dp[i][j]表示s1的前i个字符和s2的前j个字符是否能够交错构成s3的前i+j个字符。
状态转移方程:
dp[i][j]=(dp[i-1][j] && s1[i-1]==s3[i+j-1]) || (dp[i][j-1] && s2[j-1]==s3[i+j-1])
含义:
dp[i][j]取决于:
1、s1的前i-1个字符和s2的前j个字符交错构成s3的前i+j-1个字符,且s1[i-1]==s3[i+j-1]
2、s1的前i个字符和s2的前j-1个字符交错构成s3的前i+j-1个字符,且s2[j-1]==s3[i+j-1]
初始状态:
dp[0][0]=true;
dp[i][0]=dp[i-1][0] && s1[i-1]=s3[i-1]; (1=<i<=m)
dp[0][j]=dp[0][j-1] && s2[j-1]=s3[j-1]; (1=<j<=n)
AC 5ms Java:
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=1;i<=s1.length();i++){
dp[i][0]=s1.charAt(i-1)==s3.charAt(i-1)&&dp[i-1][0];
}
for(int j=1;j<=s2.length();j++){
dp[0][j]=s2.charAt(j-1)==s3.charAt(j-1)&&dp[0][j-1];
}
for(int i=1;i<=s1.length();i++){
for(int j=1;j<=s2.length();j++){
dp[i][j]=s1.charAt(i-1)==s3.charAt(i-1+j)&&dp[i-1][j]
||s2.charAt(j-1)==s3.charAt(i+j-1)&&dp[i][j-1];
}
}
return dp[s1.length()][s2.length()];
}
}