问题描述
- 写一个function,输入两个字符串序列(wordA, wordB),查找他们最长公共子序列并输出。
- 例如 wordA = ‘abcdde’, wordB = ‘bcdff’。输出:’bcd’。
思路分析
没有哪个问题是两个for循环解决不了的,如果有那就三个。
1 | // 三个for循环 |
经过实测,maxStr方法在计算长度为1000的字符串时,需要的时间为10s以上,而lcs方法在计算1000长度的字符串时,耗时在20毫秒级别,而在10000长度时,耗时3s左右。
关于优化(空间换时间)
所有针对时间上的优化,都可以归为用空间换时间,三个for循环的方法,虽然耗时长,但是中间环节不生成多余的数据。两个for循环的优化算法,虽然时间上短了,但是计算过程中,需要一个lcsarr二维数组,来存储计算过程中生成的每一个值,然后保存起来,以便后续查找使用。
这和平时用过的缓存思想极其相似,拿斐波那契数列来举例,常规的做法是通过递归调用,但是耗时会很长,如果在递归的过程中假如cache数组缓存,可以明显提高时间,但是多出来cache存储空间就是换取时间的代价。
这里我们顺便考虑下排序算法,初级排序(冒泡,插入,选择)时间复杂度为O(n^2),高级排序算法(希尔,堆排序,快速)时间复杂度O(nlogn),在不引入额外空间的条件下(事实上也没有额外办法引入),排序的时间复杂度最多限制在了nlogn这个数量级,之所以能从n^2缩减到n*logn也是因为在自身数组空间的基础上,充分利用了自身空间做的一个数据交换(比如快速排序,在自己内部通过二分法,每次处理一半数据)达到了时间上的缩减。