Interleaving String
来源:互联网 发布:淘宝开网店哪里进货 编辑:程序博客网 时间:2024/05/16 00:27
原题如下:
Given s1, s2, s3, find whether s3 is formed by the interleaving of s1 and s2.
For example,
Given:
s1 = “aabcc”,
s2 = “dbbca”,
When s3 = “aadbbcbcac”, return true.
When s3 = “aadbbbaccc”, return false.
思路:
可以考虑用动态规划的思想解决这个问题,动态规划的关键在于找到或者构建状态转移方程。针对此题,可以用dp[i][j]表示s1[0~i]&s2[0~j]组成的字符串,是否能组成s3[0,i+j]。
dp[i][j] 的上一个状态包含两种情况:
dp[i-1][j], 此时是s[i-1]应该等于s[i-1+j]
dp[i][j-1], 此时是s[i-1]应该等于s[i+j-1]
这两种状态看起来简单,但是理解起来可能不是那么直观,有兴趣的读者可以在纸上画出一个矩阵出来,然后根据题目中的case走一遍,找找感觉。
其中dp是一个[s1.length()+1][s2.length()+1]的矩阵,如果s3能够被s1和s2交叉表示,那么dp的的右下角的元素dp[s1.length()][s2.length()]肯定等于true,返回其值即可。
C++可以AC的代码如下:
bool isInterleave(string s1, string s2, string s3) { int m, n; m = s1.length(); n = s2.length(); if((m + n) != s3.length()) return false; bool **dp = new bool*[m+1]; for(int i=0; i<m+1; i++){ dp[i] = new bool[n+1]; for(int j=0; j<n+1; j++) dp[i][j] = false; } dp[0][0] = true; for(int i=0; i<m+1; i++){ for(int j=0; j<n+1; j++){ if(j>0 && s3[i+j-1] == s2[j-1] && dp[i][j-1]){ dp[i][j] = true; }else if(i>0 && s3[i-1 + j] == s1[i-1] &&dp[i-1][j]){ dp[i][j] = true; } } } return dp[m][n]; }
0 0
- Interleaving String
- Interleaving String
- Interleaving String
- Interleaving String
- Interleaving String
- Interleaving String
- Interleaving String
- Interleaving String
- Interleaving String
- Interleaving String
- Interleaving String
- Interleaving String
- Interleaving String
- Interleaving String
- Interleaving String
- Interleaving String
- Interleaving String
- Interleaving String
- EXISTS的简单程序
- Android中的消息机制-源码分析
- Codeforces Gym100650C The Game of Efil
- 小P寻宝记——粗心的基友
- 专访罗升阳:老罗的Android之旅
- Interleaving String
- HTML5+ 打开关闭侧滑窗口
- C++手稿:STL入门
- scanf和循环
- 浅谈ANR及如何分析解决ANR.1
- jboss eap 6.3 域(Domain)模式配置
- C++手稿:STL中的函数对象与函数指针
- 去掉UIScrollView的滚动条
- Android 如何判断电池电量是否充足