1. 最长回文串的定义
1、回文串是指正读和反读都一样的字符串;
如:
level
noon
2、最长回文串:即给定一组字符串,求其最长回文串的长度;
如:
给定:azbcbac
最长回文串:abcba
2. Brute-force(暴力破解算法)
1、原理:列举字符串中的所有子串,并判断它们是否为回文串;
2、时间复杂度:O(n^3);
长度为n的字符串共有n^2个子串,而子串的平均长度为n/2。
插入一个常用算法的时间复杂度和空间复杂度的表:
排序法 | 平均时间 | 最差情况 | 稳定度 | 额外空间 | 备注 |
---|---|---|---|---|---|
冒泡 | O(n^2) | O(n^2) | 稳定 | O(1) | 适合n较小时 |
交换 | O(n^2) | O(n^2) | 不稳定 | O(1) | 适合n较小时 |
选择 | O(n^2) | O(n^2) | 不稳定 | O(1) | 适合n较小时 |
插入 | O(n^2) | O(n^2) | 稳定 | O(1) | 适合大部分已排好序 |
基数 | O(log(B,R)) | O(log(B,R)) | 稳定 | O(n) | 适合B是真数,R是基数 |
Shell | O(nlogn) | O(n^s), 1<s<2 | 不稳定 | O(1) | s是指所选分组 |
快速 | O(nlogn) | O(n^2) | 不稳定 | O(nlogn) | 适合n较大时 |
归并 | O(nlogn) | O(nlogn) | 稳定 | O(1) | 适合n较大时 |
堆 | O(nlogn) | O(nlogn) | 不稳定 | O(1) | 适合n较大时 |
时间复杂度从小到大:
O(1) < O(log(n,2)) < O(n) < O(nlog(n,2)) < O(n^2) < O(n ^3) < O(2 ^n) < O(n!)
O(1), O(log(n,2)), O(n), O(nlog(n,2)) 这几个算法的时间效率算比较高;但是像O(2^n), O(3 ^n),如果n稍微大一点就崩了。
空间复杂度:是指这段代码运行过程中所占用的储存空间大小;储存空间包括3个方面 - 代码本身所占的空间、输入输出数据所占用的空间、运行过程中所占用的空间。
3. Manacher 算法
算法基础原理:利用回文串的对称性,也就是任何回文串都有其对称轴;如果回文串长度为偶数,则对称轴是中间两个字符的空隙;如果回文串长度为奇数,则对称轴是中间那个字符。遍历所有有可能为对称轴的位置,同时往左往右延伸,一旦发现字符不同则马上停止。
<