给定三个字符串 s1、s2、s3,请你帮忙验证 s3 是否是由 s1 和 s2 交错 组成的。
两个字符串 s 和 t 交错 的定义与过程如下,其中每个字符串都会被分割成若干 非空 子字符串:
输入:s1 = “aabcc”, s2 = “dbbca”, s3 = “aadbbcbcac”
输出:true
输入:s1 = “aabcc”, s2 = “dbbca”, s3 = “aadbbbaccc”
输出:false
思路:
定义一个二维boolean类型的dp数组dp[n][m],n表示s1的字符下标,m表示s2的字符小标,而dp[n][m]表示s1的n下标和s2的m下标的字符是否匹配s3的字符,递推公式:dp[n][m]=dp[n-1][m]&&s1(n-1) == s3(m+n-1) || dp[n][m-1]&&s2(m-1) == s3(m+n-1)
代码:
public boolean isInterleave(String s1, String s2, String s3) {
int n=s1.length(),m=s2.length();
//如果长度不相等则不可能匹配
if (n+m!=s3.length())
return false;
// 定义一个数组,n表示s1的字符下标,m表示s2的字符下标,dp表示是否匹配s3
boolean[][] dp=new boolean[n+1][m+1];
dp[0][0]=true;//初始化为true
for (int i = 0; i <= n; i++) {
for (int j = 0; j <= m; j++) {
int p=i+j-1;
if (i>0)//防止越界
//判断s1字符是否与s3字符匹配
dp[i][j]=dp[i][j]||(dp[i-1][j]&&s1.charAt(i-1)==s3.charAt(p));
if (j>0)//防止越界
//判断s2字符是否与s3字符匹配
dp[i][j]=dp[i][j]||(dp[i][j-1]&&s2.charAt(j-1)==s3.charAt(p));
}
}
return dp[n][m];
}