题目
给定字符串,找到它的最长回文子串,都有哪些思路呢?例如"adaiziguizhongrenenrgnohziugiziadb",回文字串很多了,但最长的是"daiziguizhongrenenrgnohziugiziad"。解题思路
思路1:
暴力法,外面的两层循环找到所有子串,第三层循环判断子串是否是回文。方法的时间复杂度为O(n^3),空间复杂度为O(1)。代码实现:
function makeOdd(str){
var len = str.length;
if(len % 2 === 1){
return str;
}
var newStr = '#';
for(i = 0;i<len;i++){
newStr += str[i]+'#';
}
return newStr;
}
function judge(str){
(str.length%2 === 0) && (str = makeOdd(str));
var len = str.length,
half = Math.floor(len/2),
last = len-half;
var i = 0;
while(i<=last){
if(str[half-i] !== str[half+i]){
return false;
}
i++;
}
return true;
}
function getAllSubs(str){
var len = str.length,
res = [];
for(var i = 0;i<len;i++){
for(var j = i;j<len;j++){
var sub = str.substring(i,j+1);
console.error(sub);
if(sub && judge(sub)){
res[res.length] = sub;
}
}
}
return res;
}
console.log(getAllSubs('abaac'));
思路2:
动态规划的方法。开辟一个P[i][j]用来表示str[i..j]是否为回文,P[i][j]的状态转移方程如下:
当i==j时,P[i][j]=true
当i+1==j时,P[i][j]=str[i]==str[j]
其他,P[i][j]=P[i+1][j-1]&&(str[i]==str[j])
这样,这个方法的时间复杂度为O(n^2),空间复杂度为O(n^2)。比暴力法有很大的改进。
当i==j时,P[i][j]=true
当i+1==j时,P[i][j]=str[i]==str[j]
其他,P[i][j]=P[i+1][j-1]&&(str[i]==str[j])
这样,这个方法的时间复杂度为O(n^2),空间复杂度为O(n^2)。比暴力法有很大的改进。
代码实现:
// 获取所有的子串回文情况
function getP2(str){
var len = str.length,
gap = '_';
var p = {};
var i,j,L;
// 只有一个字符的情况是回文
for( i =0;i<len;i++){
p[i+gap+i] = true;
}
// L是i和j之间的间隔数(因为间隔数从小到大渐增,所以大的间隔数总能包含小的间隔数)
for(L=2;L<=len;L++){
// 从0开始
for(