LeetCode 97.交错字符串
双序列型动态规划
确定状态:
判断s1
(长度为m
),与s2
(长度为n
)是否交错生成s3
(长度为p
)
- 若
m+n!=p
,直接返回false
s3[k]
不是等于s1[i-1]
就是等于s2[j-1]
k=i+j-1
状态:
设f[k][i][j]
为s3
中前k
个字符是否由s1
中前i
个字符或s2
中前j
个字符组成。
其中,k=i+j-1
,优化为f[i][j]
转移方程:
f[i][j]=((f[i-1][j] and s1[i]==s3[k] ) or f[i][j-1] and s2[i]==s3[k])
初始条件和边界:
空串由s1
的空串和s2
的空串交错形成f[0][0] = True
i==0
或者j==0
只考虑一种情况即可。
class Solution {
public boolean isInterleave(String s1, String s2, String s3) {
char []str1=s1.toCharArray();
char []str2=s2.toCharArray();
char []str3=s3.toCharArray();
int m=str1.length;
int n=str2.length;
int p=str3.length;
if((m+n)!=p)
return false;
boolean [][]f=new boolean[m+1][n+1];
int i,j;
for(i=0;i<=m;i++)
{
for(j=0;j<=n;j++)
{
if(i==0&&j==0)
{
f[i][j]=true;
continue;
}
if(j>0)
f[i][j]|=(str2[j-1]==str3[i+j-1])&&f[i][j-1];
if(i>0)
f[i][j]|=(str1[i-1]==str3[i+j-1])&&f[i-1][j];
}
}
return f[m][n];
}
}