最長回文子串-動態(tài)規(guī)劃算法

https://leetcode.cn/problems/longest-palindromic-substring/solutions/255195/zui-chang-hui-wen-zi-chuan-by-leetcode-solution/

方法一:動態(tài)規(guī)劃

  • 思路與算法
  • js實現(xiàn)
/**
 * @param {string} s
 * @return {string}
 */
var longestPalindrome = function(s) {
    let len=s.length;
    if(len < 2){
        return s
    }
    let maxLen = 1;
    let begin = 0;
    // dp[i][j]表示s[i...j]是否是回文串
    let dp = new Array(len)
    for(let i=0;i<len;i++){
        dp[i]=new Array(len)
    }
    // 初始化:所有長度為1對子串都是回文串
    for(let i=0;i<len;i++){
        dp[i][i]=true
    }
    console.log(dp)
    // 遞推開始,先枚舉子串長度
    for(let L =2;L<=len;L++){
        // 枚舉左邊界,左邊界的上限設置可以寬松一些
        for(let i=0;i<len;i++){
            // 由L和i可以確定右邊界,即j-i+1=L得
            let j=L+i-1
            // 如果右邊界越界,就可以退出當前循環(huán)
            if(j>=len){
                break;
            }
            if(s[i]!==s[j]){
                dp[i][j]=false
            }else{
                if(j-i<3){
                    // aa或aba格式的
                    dp[i][j]=true
                }else{
                    dp[i][j]=dp[i+1][j-1]
                }
            }

            // 只要dp[i][j]===true成立,就表示子串s[i...j]是回文,此時記錄回文長度和起始位置
            if(dp[i][j]&&j-i+1>maxLen){
                maxLen=j-i+1
                begin = i
                console.log(s.substring(begin,begin+maxLen))
            }
        }
    }
    return s.substring(begin,begin+maxLen)
};
  • 復雜度分析
    時間復雜度:O(n^2),其中 n 是字符串的長度。動態(tài)規(guī)劃的狀態(tài)總數(shù)為 O(n^2),對于每個狀態(tài),我們需要轉移的時間為 O(1)。
    空間復雜度:O(n^2),即存儲動態(tài)規(guī)劃狀態(tài)需要的空間。

方法二:中心擴展算法

  • 思路與算法


    中心擴展算法-思路與算法.png
  • js實現(xiàn)
/**
 * @param {string} s
 * @return {string}
 */
var longestPalindrome = function(s) {
    if(s==null||s.length<1){
        return ''
    }
    let start=0,end=0
    for(let i=0;i<s.length;i++){
        let len1=expandAroundCenter(s,i,i)
        let len2=expandAroundCenter(s,i,i+1)
        let len = Math.max(len1,len2)
        if(len>end-start){
            start=i-Math.floor((len-1)/2)
            end=i+Math.floor(len/2)
            console.log('i----start---end',i,start,end)
        }
    }
    return s.substring(start,end+1)
};
function expandAroundCenter(s,left,right){
    while(left>=0&&right<s.length&&s[left]===s[right]){
        left--
        right++
    }
    return right-left-1
}
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容