JS实现最长回文串

如题,最基本最ben的方法如下:

var longestPalindrome = function (string) {
    let n = string.length;
    let result = '';
    //外面的两层循环找到所有子串,第三层循环判断子串是否是回文。方法的时间复杂度为O(n^3),空间复杂度为O(1)。
    for (let i = 0; i < n; i++) {
        for (let j = i + 1; j <= n; j++) {
            let str = string.slice(i, j);
            let reverse_str = str.split('').reverse().join('');

            if (str == reverse_str) {
                result = str.length > result.length ? str : result;
            }
        }
    }
    return result;
};

 

以下为几种不同思路下 JavaScript 实现最长回文子串的代码及解释: ### 中心扩展法 ```javascript var longestPalindrome = function (s) { let maxLen = 0; // 记录最长回文子串的长度 let resL = 0; // 记录最长回文子串的起始位置 const offsets = [[0, 0], [0, 1]]; // 记录两种最简回文串的初始增量, s[i+0, i+0] 和 s[i+0, i+1] for (let i = 0; i < s.length; i++) { for (let offset of offsets) { let l = i + offset[0]; let r = i + offset[1]; while (l >= 0 && r < s.length && s[l] == s[r]) { // 扩展逻辑 l--; r++; } const len = r - l - 1; // [l + 1, r - 1]范围是回文串, 其长度为 (r - 1) - (l + 1) + 1 if (len > maxLen) { // 更新最长回文子串 maxLen = len; resL = l + 1; } } } return s.slice(resL, resL + maxLen); }; ``` 解释:中心扩展法的核心是从每个可能的中心位置向两边扩展来判断是否为回文串。这里考虑了两种中心情况,一种是单个字符作为中心(如 `s[i+0, i+0]`),另一种是两个相同字符作为中心(如 `s[i+0, i+1]`)。对于每个中心位置,只要左右字符相等就继续向两边扩展,直到不相等为止。每次扩展结束后计算当前回文串的长度,如果比之前记录的最长长度还长,则更新最长长度和起始位置,最后根据起始位置和长度截取最长回文子串返回 [^1]。 ### 暴力解法 ```javascript var longestPalindrome = function(s) { let m = []; let res = ''; for(let i = 0; i < s.length; i++) { for(let j = i; j < s.length; j++) { if (s[i] != s[j]) break; let ele = s.slice(i, j + 1); if (ele === ele.split('').reverse().join('') && ele.length > res.length) { res = ele; } } } return res; }; ``` 解释:暴力解法通过两层循环遍历所有可能的子串,对于每个子串,将其反转后与原串比较,如果相等且长度比之前记录的最长子串长,则更新最长子串。不过这种方法在目标字符串长度过大时,会超出时间限制,因为过多的 `for` 循环和 `js` 自带函数使用过多 [^4]。 ### 另一种中心扩展法 ```javascript while(str = readline()){ const fun = (s, left, right) => { while(left >= 0 && right < s.length && s[left] === s[right]){ left--; right++; } return s.substr(left + 1, right - left - 1).length; }; let result = 0; for(let i = 0; i < str.length; i++){ const s1 = fun(str, i, i); const s2 = fun(str, i, i + 1); result = Math.max(result, s1, s2); } console.log(result); } ``` 解释:此方法同样基于中心扩展思想,定义了一个 `fun` 函数用于从给定的左右位置向两边扩展来计算回文串的长度。在主循环中,对每个字符位置分别以其自身为中心(`s1`)和以其与下一个字符为中心(`s2`)进行扩展,取两者中较长的回文串长度,并更新最大长度,最后输出最大长度 [^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值