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];
}
}