[LeetCode] Interleaving String 解题思路
2015-12-17 00:11
405 查看
Given s1, s2, s3, find whether s3 is formed by the interleaving of s1 and s2.
For example,
Given:
s1 =
s2 =
When s3 =
When s3 =
问题 : 给定三个字符串 s1, s2, s3, 求 s3 是不是由 s1 和 s2 交错组合而成。
感觉是一条比较典型的 DP 题目。
设 i, j, k 分别是 s1, s2, s3 待求解的当前下标。
当 s3[k] != s1[i] 且 s3[k] != s2[j], 则匹配失败
当 s3[k] 只和 s1[i] 相等,则 k++ 和 i++
当 s3[k] 只和 s2[j] 相等,则 k++ 和 j++
当 s3[k] == s1[i] 且 s3[k] == s2[j] ,则分别求 k++ 和 i++ ,以及 k++ 和 j++ ,两者取或运算
由于 s3 恰好有 s1 和 s2 交错行程,所以 s3 长度必然等于 s1 + s2 的长度,知道其中二者就能确定第三个数,这样只需要二维数组保存中间结果即可。
For example,
Given:
s1 =
"aabcc",
s2 =
"dbbca",
When s3 =
"aadbbcbcac", return true.
When s3 =
"aadbbbaccc", return false.
问题 : 给定三个字符串 s1, s2, s3, 求 s3 是不是由 s1 和 s2 交错组合而成。
感觉是一条比较典型的 DP 题目。
设 i, j, k 分别是 s1, s2, s3 待求解的当前下标。
当 s3[k] != s1[i] 且 s3[k] != s2[j], 则匹配失败
当 s3[k] 只和 s1[i] 相等,则 k++ 和 i++
当 s3[k] 只和 s2[j] 相等,则 k++ 和 j++
当 s3[k] == s1[i] 且 s3[k] == s2[j] ,则分别求 k++ 和 i++ ,以及 k++ 和 j++ ,两者取或运算
由于 s3 恰好有 s1 和 s2 交错行程,所以 s3 长度必然等于 s1 + s2 的长度,知道其中二者就能确定第三个数,这样只需要二维数组保存中间结果即可。
vector<vector<int>> vv; bool interIleave(string s1, string s2, string s3, int p1, int p2, int p3){ // cout << s1 << "\n" << s2 << "\n" << s3 << "\n--------\n"; if (s1.size() == 0) { return (s2 == s3); } if (s2.size() == 0) { return (s1 == s3); } if (vv[p1][p3] != -1) { return vv[p1][p3]; } if (s3[0] != s1[0] && s3[0] != s2[0]) { vv[p1][p3] = false; return false; } if (s3[0] == s1[0] && s3[0] != s2[0]) { bool tmpb = interIleave(s1.substr(1), s2, s3.substr(1), p1+1, p2, p3+1); vv[p1][p3] = tmpb; return tmpb; } if (s3[0] != s1[0] && s3[0] == s2[0]) { bool tmpb = interIleave(s1, s2.substr(1), s3.substr(1), p1, p2+1, p3+1); vv[p1][p3] = tmpb; return tmpb; } bool inter1 = interIleave(s1.substr(1), s2, s3.substr(1), p1+1, p2, p3+1); bool inter2 = interIleave(s1, s2.substr(1), s3.substr(1), p1, p2+1, p3+1); bool res = inter1 || inter2; vv[p1][p3] = res; return res; } bool isInterleave(string s1, string s2, string s3) { vector<vector<int>> tmp(s1.size(), vector<int>(s3.size(), -1)); vv = tmp; if (s3.size() != s1.size()+s2.size()) { return false; } if (s3.size() == 0) { return true; } bool res = interIleave(s1, s2, s3, 0, 0, 0); return res; }
相关文章推荐
- 在Spring下集成ActiveMQ
- HDU2844:Coins
- R读书笔记之特征工程(一)空值处理
- 进程栈与线程栈
- Android之基于xmpp openfire smack开发之smack类库介绍和使用[2]
- Linux 初始化 init 系统,第 3 部分: Systemd
- LeetCode 172:Factorial Trailing Zeroes
- redis基本命令及应用场景
- 年终总结#我的2012年-“初”
- Linux 初始化 init 系统,第 2 部分: UpStart
- 微信开发之使用java获取签名signature
- CentOS下PHP7的编译安装及MySQL的支持和一些常见问题的解决办法
- PHP响应post请求上传文件的方法
- PHP实现发送邮件的方法(基于简单邮件发送类)
- php提交post数组参数实例分析
- WordPress中获取页面链接和标题的相关PHP函数用法解析
- PHP附件下载中文名称乱码的解决方法
- WordPress中用于获取文章作者与分类信息的方法整理
- 例题5-1 UVA 11292 The Dragon of Loowater勇者斗恶龙
- Android Studio从4.4升级所有版本SDK