JavaScript之最长回文字符串

JavaScript经典面试题算法:最长回文字符串

下面的解题方法是通过中心扩散法的方式实现的,具体代码和注释如下(时间复杂度: O(n^2),空间复杂度:O(1))

// str字符串
function longestPalindrome(str) { function palindrome(s, l, r) { // 循环条件:当 左边索引 >= 0 右边索引 < 字符串长度,并且左右索引的值相等 while(l >= 0 && r < s.length && s[l] === s[r]) { l-- r++ } // 复制 l - r 之间的字符串返回 return s.slice(l + 1, r) } if(str.length < 2) { return str } let palindromeStr = '' for(let i = 0; i < str.length; i++) { // 单数回文字符串的情况 // 如:aaccbb,这个字符串只会返回:a, // 因为它是双数回文字符串,而这种做法只会从单个字符的左右两边扩散左右 const str1 = palindrome(str, i, i) // 双数回文字符串的情况、 // 如:aaccbb,那么会从 aa cc bb的 两边扩散 const str2 = palindrome(str, i, i + 1) // 得到最长的回文字符串 const curPlindromeStr = str1.length > str2.length ? str1 : str2 // 与返回中的回文字符串做比较 if(curPlindromeStr.length > palindromeStr.length) { palindromeStr = curPlindromeStr } } return palindromeStr }

 

测试用例:

const str1 = 'aacaacddcaaaab'
const str2 = 'cccdzabcdcbaccds'
const str3 = 'aaaabcdcbaddd'
const str4 = 'ac'
const str5 = 'aaa'

console.log(longestPalindrome(str1)) // clg -> aacddcaa
console.log(longestPalindrome(str2)) // clg -> abcdcba
console.log(longestPalindrome(str3)) // clg -> abcdcba
console.log(longestPalindrome(str4)) // clg -> a
console.log(longestPalindrome(str5)) // clg -> aaa

  

 

posted @ 2021-12-01 11:20  C+V-Engineer  阅读(441)  评论(0编辑  收藏  举报