面试题之interleave字符串分析
来源:互联网 发布:淘宝上美的官方旗舰店 编辑:程序博客网 时间:2024/06/17 21:30
interleave字符串分析
原题
3个字符串a,b,c。判断c是否是a和b的interleave,也就是c中应该有a,b中所有字 符,并且c中字符顺序和a,b中一样。比如,
a = "ef" b = "gh" c = "egfh" return true;
a = "ef" b = "gh" c = "ehgf" return false。
分析
这个题目中,并没有说明a和b中是否有相同的字符,这个直接影响了最终的解法。所以,大家在面试的过程中,要和面试官进行交互,弄清楚之后再动手。我们这里对于是否有相同的字符都给予分析。希望对大家有所帮助。
a和b没有相同字符的情况
这个情况处理起来比较简单,逐个字符遍历c字符串,首先处理第一个字符,将其与a中的字符匹配,如果没有匹配,则与b中的字符逐个匹配,如果没有匹 配,则返回false;如果a中或者b中有一个字符和c的第一个字符匹配上了,则如上考虑第二个字符,与c的第一个字符匹配上的字符串,也考虑第二个字 符,依次类推。直到c遍历完,这时,如果a和b还有字符没有遍历,也返回false,都遍历完毕,返回true。代码如下:
上面算法的时间复杂度是多少呢?我们只需要考虑a和b的遍历情况,要么a++,要么b++,所以算法的时间复杂度为O(m+n),m和n分别为a和b的长度。a和b这两个字符串,各自遍历一遍即可。
a和b有相同字符的情况
上面的算法,不能够处理a和b中有相同字符的情况,例如a="XXY",b="XXZ",c="XXZXXY"。如果要处理,有相同字符的情况也是 比较直接的。有相同的出现,如果都匹配了c中的字符,则两种匹配分别都考虑,只要有一个返回true,整个算法就返回true。
注意后面是||,两种情况都要考虑的。
上面这个算法的时间复杂度,在最坏的情况下是指数级的。所以,下面介绍一个动态规划的解法。一个问题能够用动态规划来解的一个前提是:要有重复的子 问题。这样把子问题的解存储起来,后面重复利用才可以提高算法的效率。这个问题有子问题么?考虑一个极端的例 子:a="XXX",b="XXX",c="XXXXXX"。子问题,显然存在。再不然,画出递归树,就很明了了。
我们采用二维表来存储子问题的结果,IL[i][j]如果为true,则表示c[0..i+j-1]是a[0..i-1]和b[0..j-1]的interleave字符串。算法实现的过程于上面的递归类似:
通过动态规划的方法改进,算法的时间复杂度O(mn),空间复杂度O(mn)
- 面试题之interleave字符串分析
- 待字闺中之interleave字符串分析
- 面试题之字符串
- 判断字符串interleave
- 笔试面试题之字符串
- 面试题之两个字符串
- [C++面试题]之字符串
- 面试题之字符串反转
- 面试题之字符串反转
- 面试题之字符串反转
- 【字符串】面试题之奇偶字符串分离
- 面试点:字符串strcpy函数(C语言面试题分析之二)
- 面试题之原地倒转字符串
- 【字符串】面试题之替换子串
- 面试题之_00(旋转字符串)
- 面试题之_01(字符串包含)
- C++面试题之字符串的拷贝
- PHP面试题之字符串反转
- Linux设备驱动---自旋锁
- 华为2014年机试题【输入1--50个数字,求出最小数和最大数的和】
- excel关闭按钮不能退出
- 数据结构的排序算法(直接插入)
- MongoDB在windows下的安装配置
- 面试题之interleave字符串分析
- Android源码编译整理总结
- 在 Sandboxed Mac App 中嵌入第三方可执行文件
- 类模板(3种)
- LK60xWin.dll LK-607 读卡器
- java读取txt文档到string中
- 基于Ant+Selenium+TestNG的测试框架配置
- Weblogic下的应用程序,客户端打印时提示权限不够
- Linux安装程序Anaconda分析