Leetcode-最长回文子串

11/26/2022

# Leetcode - 0005 - 最长回文子串

# 1.题目链接 (opens new window)

>
>
>给你一个字符串 `s`,找到 `s` 中最长的回文子串。

# 2. 思路

  • 状态转移方程

    f[i][j] 表示 字符串 [l, r] 是否为回文子串。则易得状态转移方程为f[i][j] = f[i + 1][j - 1] && (s[i] == s[j])

  • 状态初始化

    考虑 字符串长度为1 和 2 时的边界情况,递推前可进行特殊初始化操作

    for(int i = 0; i < len; i ++)
            {
                f[i][i] = true;
                if(i + 1 < len && s[i] == s[i + 1])
                {
                    ans = 2;
                    bg = i;
                    f[i][i + 1] = true;
                }
            }
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10

# 3.代码

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

string longestPalindrome(string s) {
        bool f[1010][1010] = {false};
        int len = s.size();
        int ans = 1;
        int bg = 0;
        for(int i = 0; i < len; i ++)
        {
            f[i][i] = true;
            if(i + 1 < len && s[i] == s[i + 1])
            {
                ans = 2;
                bg = i;
                f[i][i + 1] = true;
            }
        }
        for(int i = 3; i <= len; i ++)
        {
            for(int j = 0; j + i <= len; j ++)
            {
                //cout << i << " " << j << endl;
                int l = j;
                int r = j + i - 1;
                if(f[l + 1][r - 1] && (s[l] == s[r]))
                {
                    f[l][r] = true;
                    if(i > ans) {ans = i; bg = j;}
                }
            }
        }
        return s.substr(bg, ans);
    }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31