leetcode日记(84)交错字符串
很明显的动态规划,就是怎么用想了一段时间。(开始还怀疑过是不是双指针,发现不行,因为会出现s3的下一个字符同时能够匹配到两个字符串字符的情况)
然后就是构建数组dp[101][101],数组代表前x个s1字符和前y个s2字符是否与前x+y个s3是交错字符串。
不断递归就行了:
class Solution {
public:string s1,s2,s3;int dp[101][101];bool dg(int x,int y){if(s1.size()==x&&s2.size()==y){dp[x][y]=1;return 1;}if(dp[x][y]!=-1) return dp[x][y]==1;bool b=0;if(s1.size()>x&&s1[x]==s3[x+y]){b=b|dg(x+1,y);}if(s2.size()>y&&s2[y]==s3[x+y]){b=b|dg(x,y+1);}dp[x][y]=b;return b;}bool isInterleave(string s1, string s2, string s3) {if(s1.size()+s2.size()!=s3.size()) return 0;this->s1=s1;this->s2=s2;this->s3=s3;memset(dp,-1,sizeof(dp));dg(0,0);return dp[s1.size()][s2.size()]==1;}
};
学到了一点东西就是可以用-1、0、1三种状态分别代表未判断、不是交错字符串、是交错字符串,之前也用到过这种做法,可以降低复杂度。