首页 > 代码库 > 【leetcode】Interleaving String
【leetcode】Interleaving String
题目:给定三个串str1,str2,str3,判断str3是否是str1,str2的交叉字符串。
交叉字符串:两个字符串的字符交叉,组成新的字符串,要求属于原来字符串中的字符在新的生成的交叉字符串中的顺序与原顺序相同。即若a、b在源字符串中时a在前面,那么在新的字串中时,a也的在b的前面。
回想问题Distinct Subsequences,其形式表示为 S --通过合理的规则----得到 T 的方法数。
本题套用这种模式就是:str1,str2 ---通过合理的规则---得到str3的方法数。当方法数大于等于1的时候,我们返回true,为0时返回false。
bool isInterleave(string s1, string s2, string s3) { if(0 == s1.size() && 0 == s2.size() && 0 == s3.size()) return true; if(s1.size() + s2.size() != s3.size()) return false; int len1 = s1.size(); int len2 = s2.size(); int len3 = s3.size(); //vector<vector<bool> > dp(len1 + 1, vector<bool>(len2 + 1, false)); vector<vector<int> > dp(len1 + 1, vector<int>(len2 + 1, 0)); //initial //dp[0][0] = true; dp[0][0] = 1; for (int i = 1; i <= len1; ++i) { if(s1[i - 1] == s3[i - 1]) dp[i][0] = 1; } for (int j = 1; j <= len2; ++j) { if(s2[j - 1] == s3[j - 1]) dp[0][j] = 1; } for (int i = 1; i <= len1; ++i) for (int j = 1; j <= len2; ++j) { if(s1[i - 1] == s3[i + j - 1] && s2[j - 1] == s3[i + j - 1]) dp[i][j] = dp[i - 1][j] + dp[i][j - 1]; //dp[i][j] = dp[i - 1][j] || dp[i][j - 1]; else if(s1[i - 1] == s3[i + j - 1]) dp[i][j] = dp[i - 1][j]; else if(s2[j - 1] == s3[i + j - 1]) dp[i][j] = dp[i][j - 1]; } return dp[len1][len2] > 0; //return dp[len1][len2]; }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。