zoukankan      html  css  js  c++  java
  • leetcode 5 最长回文串

    简介

    使用中心扩散法, 发现我的代码有很多的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) wedgeleft(S i==S_{j} ight) ]

    状态边界条件

    [P(i, i)= ext { 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第二个参数不一样. 一个表示坐标, 一个表示个数.
        }
    }
    
    Hope is a good thing,maybe the best of things,and no good thing ever dies.----------- Andy Dufresne
  • 相关阅读:
    CSS样式
    Python宏观
    javaScript----------(函数)
    vue-----5计算属性
    python之函数作用域、嵌套以及闭包
    python之函数的定义、传参以及动态参数
    python之文件操作
    基础数据类型的补充以及深浅copy
    小数据池、代码块以及编码转换
    python基础二
  • 原文地址:https://www.cnblogs.com/eat-too-much/p/14800762.html
Copyright © 2011-2022 走看看