最长回文字串
- 这个算法题也是比较的有意思,题意就是求出一个字符串的最长回文子串,应该有很多种方法,我分享一下我的算法
- 算法思路
- 回文有两种形式,一种是lol,一种是lool,前者是单核,后者是双核
- 以下是算法步骤:
- 第一步:创建一个索引变量cen来遍历整个字符串,还有一个辅助的变量ocen=cen+1,作用就是判断是单核还是双核,如果 str[cen] === str[ocen],那就是双核,否则就是单核
- 第二步:安排两个指针i,j,以cen(单核的话)为中心或者以 cen,ocen(双核的话)为中心,来逐个遍历两边的字符是不是相同的,如果相同接着遍历,如果不相同,cen会指向下一个索引,知道cen遍历完整个字符串
// 最长回文子串
// 回文有两种情况:1.lol 2.lool
function getHuiWenByStr(str){
var cen = 0,ocen = 0
var i = 0,j = 0
var cache = []
var len = str.length
for(;cen<len;cen++){
i++
j++
ocen = cen+1
// oo
if(str[ocen] === str[cen]){
cache.push(str.slice(cen,ocen+1))
}
if(i>cen){
i=0
j=0
continue
}
if(j>len-ocen){
i=0
j=0
continue
}
// lool,进入双核判断
if(str[ocen] === str[cen]){
while(str[cen-i] === str[ocen+j]){
i++
j++
}
if(i > 1 && j > 1){
cache.push(str.slice(cen-i+1,ocen+j))
}
i=0
j=0
continue
}
// lol 单核模式
while(str[cen-i] === str[cen+j]){
i++
j++
}
if(i > 1 && j > 1){
cache.push(str.slice(cen-i+1,cen+j))
}
i=0
j=0
}
return cache.sort((a,b)=>b.length-a.length)[0]
}