[leetcode - Bliend-75 ] 5. Longest Palindromic Substring (Me

Given a string s, return the longest palindromic substring in s.

给一个 string 回传该 string 最长的 palindromic substring.

Example

Input: s = "babad"
Output: "bab" || "aba"

Input: s = "cbbd"
Output: "bb"

Thanking

目的是要找到最长的 palindromic substring,可以使用 for 迴圈把每一个 substring 找出来并判断哪一个是最长的,[[b], [ba], [bab], [baba], [babad], [a], [ab], [aba], ....] 但这种方法的时间複杂度为 O(n^3) 太慢了,所以可以用 dynamic programming 减少时间複杂度。

Step

基数

指定一个 chart 后检查他的左右边的 chart 是否是相等的
http://img2.58codes.com/2024/20124767yjARa9OUNA.jpg
如果是一样的就在往旁边检查
http://img2.58codes.com/2024/20124767ts2qsq48E6.jpg
如果找到两边不相等的时候则代表这个 palindromic substring 的长度。

偶数

指定一个 chart 后检查他旁边的 chart 是否相等
http://img2.58codes.com/2024/201247676a3xo4jsWe.jpg
如果相等则在往旁边检查
http://img2.58codes.com/2024/20124767adRZasnbrJ.jpg
一直往旁边移动直到找到这个 chart 和指定的 chart 不同的时候就代表这个 palindromic substring 的长度。

Coding

var longestPalindrome = function (s) {    let res = [0, 1];    for (let i = 0; i < s.length; i++) {        const even = helper(i - 1, i, s);                           // (1)        const odd = helper(i - 1, i + 1, s);                        // (2)        const type = even[2] > odd[2] ? even : odd;                 // (3)        res = res[1] - res[0] > type[1] - type[0] ? res : type;     // (4)    }    return s.substring(res[0], res[1]);}function helper(l, r, s) {    if (l < 0 || r > s.length) return [l + 1, r];    while (l >= 0 && r < s.length) {        if (s[l] === s[r]) {            l--;            r++;        } else {            break;        }    }    return [l + 1, r, r - l + 1];                                    // (5)}
(1): 找到偶数的最长 substring(2): 找到基数的最长 substring(3): 比较偶数和基数的 substring 哪一个比较长(4): 将比较长的 substring 暂存 res(5): 如果发现左边的 chart 和右边的 chart 不同则回传 [左边的index, 右边的index, 左右index中间有多少的 chart]

Time complexity: O(n^2)


关于作者: 网站小编

码农网专注IT技术教程资源分享平台,学习资源下载网站,58码农网包含计算机技术、网站程序源码下载、编程技术论坛、互联网资源下载等产品服务,提供原创、优质、完整内容的专业码农交流分享平台。

热门文章