题目链接

  题目要求: 

  Given s1s2s3, 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.

  这道题的难度还是很大。

  在GeeksforGeeks上举了一个例子来说明什么是Interleaving String:

Input: str1 = "AB",  str2 = "CD"
Output:
ABCD
ACBD
ACDB
CABD
CADB
CDAB Input: str1 = "AB", str2 = "C"
Output:
ABC
ACB
CAB

  具体的对该题的分析和解决参考了一博文

  像这种判断能否按照某种规则来完成求是否或者某个量的题目,很容易会想到用动态规划来实现。
  先说说维护量,res[i][j]表示用s1的前i个字符和s2的前j个字符能不能按照规则表示出s3的前i+j个字符,如此最后结果就是res[s1.length()][s2.length()],判断是否为真即可。接下来就是递推式了,假设知道res[i][j]之前的所有历史信息,我们怎么得到res[i][j]。可以看出,其实只有两种方式来递推,一种是选取s1的字符作为s3新加进来的字符,另一种是选s2的字符作为新进字符。而要看看能不能选取,就是判断s1(s2)的第i(j)个字符是否与s3的i+j个字符相等。如果可以选取并且对应的res[i-1][j](res[i][j-1])也为真,就说明s3的i+j个字符可以被表示。这两种情况只要有一种成立,就说明res[i][j]为真,是一个或的关系。所以递推式可以表示成

res[i][j] = res[i-][j]&&s1.charAt(i-)==s3.charAt(i+j-) || res[i][j-]&&s2.charAt(j-)==s3.charAt(i+j-)

  时间上因为是一个二维动态规划,所以复杂度是O(m*n),m和n分别是s1和s2的长度。最后就是空间花费,可以看出递推式中只需要用到上一行的信息,所以我们只需要一个一维数组就可以完成历史信息的维护,为了更加优化,我们把短的字符串放在内层循环,这样就可以只需要短字符串的长度即可,所以复杂度是O(min(m,n))。

  具体程序如下:

 class Solution {
public:
bool isInterleave(string s1, string s2, string s3) {
int szS1 = s1.size();
int szS2 = s2.size();
int szS3 = s3.size();
if(szS3 != szS1 + szS2)
return false;
if(szS1 == && szS2 == )
return s3 == s1 || s3 == s2; string minWord = szS1 > szS2 ? s2 : s1;
string maxWord = szS1 > szS2 ? s1 : s2;
int szMinWord = min(szS1, szS2);
int szMaxWord = max(szS1, szS2); vector<bool> match(szMinWord + , true);
for(int i = ; i < szMinWord + ; i++)
{
match[i] = match[i - ] && minWord[i - ] == s3[i - ];
} for(int i = ; i < szMaxWord; i++)
{
match[] = match[] && s3[i] == maxWord[i];
for(int j = ; j < szMinWord + ; j++)
{
match[j] = (match[j - ] && minWord[j - ] == s3[i + j]) || (match[j] && maxWord[i] == s3[i + j]);
}
} return match[szMinWord];
}
};

最新文章

  1. android的消息处理机制——Looper,Handler,Message
  2. Linux 流程控制语句 if else、for、while、until
  3. Struts 2, 值在验证失败回到原来页面的时候会丢失的解决方案
  4. MyBatis返回主键
  5. linux下安装nginx、pcre、zlib、openssl
  6. 2sum、3sum、4sum以及任意连续的数的和为sum、任意连续或者不连续的数的和为sum
  7. Android项目svn代码管理问题[转]
  8. HDU --2665
  9. php简单数据缓存类
  10. .net 正则获取url参数
  11. 解决Android Studio 将String类型保存为.txt文件,按下button跳转到文件管理器(解决了保存txt文件到文件管理后,手机打开是乱码的问题)
  12. Python标准库01正则表达式
  13. 占满屏幕的宽高,当把textarea换成其他标签的时候,怎么才能编辑?
  14. 开关电源五种PWM反馈控制模式
  15. 蓝桥杯 ALGO-1:区间k大数查询
  16. linux 命令及配置文件搜索命令which、whereis
  17. Ubuntu18.04 怎么开热点
  18. 如何利用Xshell在windows与linux之间互传文件
  19. phpcms tag页调用缩略图
  20. Android Java访问本地方法(JNI)

热门文章

  1. RxJava操作符(05-结合操作)
  2. 使用jQuery AJAX读取二进制数据
  3. UE4 C++与蓝图交互
  4. 安卓自定义日期控件(仿QQ,IOS7)
  5. iOS中 Realm的学习与使用 韩俊强的博客
  6. Cocos2D iOS之旅:如何写一个敲地鼠游戏(九):创建动画
  7. Linux技巧:一次删除一百万个文件的最快方法
  8. 2015-2016机器人操作系统(ROS)及其应用暑期学校资料汇总 ROS Summer School 持续更新
  9. Android LK Bootlaoder启动概览
  10. 95%的bug是由程序员造成的