LeetCode 97. Interleaving String
2016-04-18 09:20
375 查看
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 =
I usually want to find a DP equation first, just recently realized that IT'S BETTER TO
first formalize a backtracking version and then memorize the intermediate value using tables (same idea as Compilers??)
DP is to memory the repetitive intermediate values for later use. The essence however, is backtracking, backtracking, backtracking....
s1 and s2.
For example,
Given:
s1 =
"aabcc",
s2 =
"dbbca",
When s3 =
"aadbbcbcac", return true.
When s3 =
"aadbbbaccc", return false.
I usually want to find a DP equation first, just recently realized that IT'S BETTER TO
first formalize a backtracking version and then memorize the intermediate value using tables (same idea as Compilers??)
DP is to memory the repetitive intermediate values for later use. The essence however, is backtracking, backtracking, backtracking....
#include <string> #include <iostream> #include <vector> using namespace std; bool isInterLeave(string s1, int i, string s2, int j, string s3, int k) { if(i == s1.size() && j == s2.size() && k == s3.size()) return true; if((s3[k] != s1[i]) && (s3[k] != s2[j])) return false; return (isInterLeave(s1, i + 1, s2, j, s3, k + 1) && (s1[i] == s3[k])) || (isInterLeave(s1, i, s2, j + 1, s3, k + 1) && (s2[j] == s3[k])); } bool isInterLeave(string s1, string s2, string s3) { if(s3.size() != (s1.size() + s2.size())) return false; int i = 0, j = 0, k = 0; return isInterLeave(s1, i, s2, j, s3, k); } // First backtracking version. // Table to memory the intermediate results. bool isInterLeaveII(string s1, string s2, string s3) { int n1 = s1.size(); int n2 = s2.size(); int n3 = s3.size(); if(n1 + n2 != n3) return false; vector< vector<bool> > dp(n1 + 1, vector<bool>(n2 + 1, false)); dp[0][0] = true; for(int i = 1; i <= n1; ++i) dp[i][0] = (dp[i-1][0] && s1[i-1] == s3[i-1]); for(int j = 1; j <= n2; ++j) dp[0][j] = (dp[0][j-1] && s2[j-1] == s3[j-1]); for(int i = 1; i <= n1; ++i) { for(int j = 1; j <= n2; ++j) { dp[i][j] = (dp[i-1][j] && s1[i-1] == s3[i + j - 1] || dp[i][j-1] && s2[j-1] == s3[ i + j - 1]); } } return dp[n1][n2]; } int main(void) { cout << isInterLeaveII("aabcc", "dbbca", "aadbbcbcac") << endl; cout << isInterLeaveII("ac", "b", "acc") << endl; cout << isInterLeaveII("ac", "b", "abc") << endl; }
相关文章推荐
- NSArray的4种遍历方式
- 都想“Uber”别人的大脑,为什么是“在行”领先?
- SSL/TLS 协议介绍
- c#中实现朗读文本功能
- 想成为年薪30W+的运营,你必须具备这4个“运营思维”
- Tomcat下取消POST大小的限制
- Word 2010文档中参考文献自动编号后间距太大的解决方法
- android开发之&使用viewFlipper实现轮播图,超级简单
- 聊聊为应用创建「一致性设计」的几个原则
- 多线程的同步与互斥
- numpy 常用 api(四)
- HashSet实现原理
- Android framework回想(2) sp 和 wp sp对象
- 安卓开发树形控件之ExpandableListView(一)
- Effective STL 条款12
- mybatis 不为空设置
- Power Designer逆向工程连接数据库创建pdm-oracle
- Python反射
- mysql优化(三)–explain分析sql语句执行效率
- Matlab之索引图像转化为灰度图和真彩图