LeetCode 5——最长回文子串

1. 题目

2. 解答

我们定义状态 state[i][j] 表示子串 s[i, j] 是否为回文子串,如果 s[i, j] 为回文子串,并且有 s[i-1] == s[j+1],那么 s[i-1, j+1] 也为回文子串。状态转移方程为:

[state[i][j] = 1 space 如果 space i = j ]

[state[i][j] = egin{cases} state[i+1][j-1] & ext{如果 } s[i] == s[j] \ 0 & ext{如果 } s[i] != s[j] end{cases}]

注意我们需要自底向上更新状态,首先是长度为 1 的子串,再然后是长度为 2 的,一直递增下去。

string longestPalindrome(string s) {

    int n = s.size();
    if (n == 0) return s;
    
    vector<bool> temp(n, true);
    vector< vector<bool>> state(n, temp);
    int max_len = 1;
    int begin = 0;
    int end = 0;
    // 坐标差从 1 开始,也即长度为 2
    for (int len = 1; len < n; len++)
    {
        for (int i = 0; i < n-len; i++)
        {
            int j = i + len;
            if (s[i] == s[j])
                state[i][j] = state[i+1][j-1];
            else    state[i][j] = false;
            
            if (state[i][j])
            {
                if (j - i + 1 > max_len)
                {
                    max_len = j - i + 1;
                    begin = i;
                    end = j;
                }
            }
        }
    }
    string ret(s.begin()+begin, s.begin()+end+1);
    return ret;
}

获取更多精彩,请关注「seniusen」!

原文地址:https://www.cnblogs.com/seniusen/p/11991121.html