1. 程式人生 > 資料庫 >redis6.0.5之Rax閱讀筆記1-相關資料結構和部分輔助函式

redis6.0.5之Rax閱讀筆記1-相關資料結構和部分輔助函式

最長迴文子串

給你一個字串 s,找到 s 中最長的迴文子串。

示例 1:

輸入:s = “babad”
輸出:“bab”
解釋:“aba” 同樣是符合題意的答案。
示例 2:

輸入:s = “cbbd”
輸出:“bb”
示例 3:

輸入:s = “a”
輸出:“a”
示例 4:

輸入:s = “ac”
輸出:“a”

思路

用一個二元組p[i][j]表示字串s中從下標為i的字母到下標為j的字母確定的子串是否為迴文,若是則p[i][j]=1,否則為0,建立好這樣一個二元組後,遍歷二元組,返回j-i最大且對應p[i][j]=1所代表的子串即可。

判斷:1.若 S[i] == S[j],那麼只要 S[i+1] 至 S[j-1] 是迴文子串,S[i] 至 S[j] 就是迴文子串;如果S[i+1] 至 S[j-1] 不是迴文子串,則 S[i] 至 S[j] 也不是迴文子串。

2.若 S[i] != S[j],那麼 S[i] 至 S[j] 一定不是迴文子串。    
  由此可以寫出狀態轉移方程:

dp[i][j]=dp[i+1][j−1], S[i]==S[j]
    0, S[i]!=S[j]

程式碼

class Solution {
public:
    string longestPalindrome(string s) {
        int p[1000][1000];
        int x=s.size();
        int a=1;int k1=0;
        if(x==1){
            return s;
        }
if(x==2){ if(s[0]==s[1]){ return s; } else{ return s.substr(0,1); } } for(int i=0;i<x;i++){ p[i][i]=1; if(i<x-1){ if(s[i]==s[i+1]){ p[i]
[i+1]=1; } else{ p[i][i+1]=0; } } } for(int l=3;l<=x;l++){ for(int i=0;i+l-1<x;i++){ if(s[i]==s[i+l-1]&&p[i+1][i+l-2]==1){ p[i][i+l-1]=1; } else{ p[i][i+l-1]=0; } } } for(int i=0;i<x;i++){ for(int j=i;j<x;j++){ if(p[i][j]==1&&j-i+1>a){ a=j-i+1; k1=i; } } } return s.substr(k1,a); } };

在這裡插入圖片描述
好難