简介

使用中心扩散法, 发现我的代码有很多的bug.改了很久

简单来说动态规划, 不如 中心扩散法来的容易理解.

code

class Solution {
public:
    string longestPalindrome(string s) {
        //int n = s.length();
        //cout << n << endl;
        if(s.size() < 2) {
            return s;
        }
        vector<vector<bool> > dp;
        dp.resize(s.length());
        for(int i=0; i<s.length(); i++){
            dp[i].resize(s.length());
            for(int j=0; j<s.length(); j++){
                dp[i][j] = false;
            }
        }
        
        int maxLength = 0;
        int maxStart = 0;
        for(int i=0; i<s.length(); i++){
            dp[i][i] = true;
            if(maxLength == 0) {
                maxStart = i;
                maxLength = 1;
            }
            int j = i+1;
            while(j < s.length() && s[i] == s[j]){
                    dp[i][j] = true;
                    if(maxLength < j - i + 1) {
                        maxLength = j - i + 1;
                        maxStart = i;
                        
                    }
                    j++;

            }
        }
        int i,j,k;
        
        for(i=0; i<s.size(); i++){
            // 寻找左边界
            //cout << "j " << j << endl;
            for(j=i-1; j>=0; j--){
                if(dp[j][i] == false)
                break;
            }
            //cout << "j " << j << endl;
            // 寻找右边界
            for(k=i+1; k<s.size(); k++){
                if(dp[i][k] == false){
                    break;
                }
            }
            while(j>=0 && k < s.size() && s[j] == s[k]){
                dp[j][k] = true;
                if(k - j + 1 >= maxLength){
                    maxLength = k - j + 1;
                    maxStart = j;
                }
                j--;
                k++;
            }
        }
        //cout << "here " << maxStart << " " << maxLength << endl;
        return s.substr(maxStart, maxLength);
    }
};

状态转移方程

\[P(i, j)=P(i+1, j-1) \wedge\left(S i==S_{j}\right) \]

状态边界条件

\[P(i, i)=\text { true } \]

class Solution {
    public String longestPalindrome(String s) {
        int len = s.length();
        if(len < 2) {
            return s;
        }

        int maxLen = 1;
        int begin = 0;
        boolean[][] dp = new boolean[len][len];
        for(int i=0; i<len; i++){
            dp[i][i] = true;
        }
        char[] charArray = s.toCharArray();
        for(int L=2; L<=len; L++){
            for(int i=0; i<len; i++){
                int j = L+i-1;
                if(j >= len){
                    break;
                }
                if(charArray[i] != charArray[j]){
                    dp[i][j] = false;
                } else{
                    if(j - i < 3){
                        dp[i][j] = true;
                    }else{
                        dp[i][j] = dp[i+1][j-1]; // 如果此次相等, 那么他的状态就等于前一个状态
                    }
                }
                if(dp[i][j] && j - i + 1 > maxLen){
                    maxLen = j - i + 1;
                    begin = i;
                }
            }
        }
        return s.substring(begin, begin + maxLen); // 注意java 里面的substring 与 C++ 中 substr第二个参数不一样. 一个表示坐标, 一个表示个数.
    }
}
posted on 2021-05-23 11:40  HDU李少帅  阅读(36)  评论(0编辑  收藏  举报