大致思路:
(via简书yoshino)
这种又是涉及两个子串的题,又用动态规划来做。但是有时候很不好想到动态规划的含义,我觉得就大胆一点吧....而且一般这种字符串的动态规划都是跟“长度”有关!然后再举简单的例子来模拟过程,从而设计出转移方程!
这道题过程看懂了就很好理解的,只是在编程要注意:dp数组下标从1开始,表示的是“第几个”或“有多长”,而字符串肯定是从0开始的。
AC代码:
class Solution {
public:
bool isInterleave(string s1, string s2, string s3) {
bool dp[2000][2000];
//dp[i][j]表示s3的前i+j个字符可以由s1的i个字符和s2的j个字符交叉而成
int len1=s1.size();
int len2=s2.size();
int len3=s3.size();
if(len1+len2!=len3) return false;
//dp数组的初始化——一般就想某一维为0或为1的情况
dp[0][0]=true;
for(int i=1;i<=len2;i++)
{
dp[0][i] = dp[0][i-1] && s2[i-1]==s3[i-1];
}
for(int i=1;i<=len1;i++)
{
dp[i][0] = dp[i-1][0] && s1[i-1]==s3[i-1];
}
for(int i=1;i<=len1;i++)
{
for(int j=1;j<=len2;j++)
{
if(dp[i-1][j] && s1[i-1]==s3[i+j-1])
dp[i][j]=true;
else if(dp[i][j-1] && s2[j-1]==s3[i+j-1])
dp[i][j]=true;
else
dp[i][j]=false;
}
}
return dp[len1][len2];
}
};