zoukankan      html  css  js  c++  java
  • Longest Palindromic Substring

    Longest Palindromic Substring


    Given a string s, find the longest palindromic substring in s. You may assume that the maximum length of s is 1000.

    Example 1:

    Input: "babad"
    Output: "bab"
    Note: "aba" is also a valid answer.
    Example 2:

    Input: "cbbd"
    Output: "bb"


    在学习动态规划时刷到的一道题,题目求的是给定字符串中最长的回文字符串序列,算是非常经典的一道题了。本题有许多解法,在此只列举两种。

    1. 动态规划

    既然其在LeetCode属于动态规划题目,自然免不了动态规划的方法,首先定义一个bool二维数组dp[i][j]代表的是从第i个字符到第j个字符之间的字符串是否是回文字符串,自然状态方程很容易得到如下:

     对应代码如下:

    class Solution {
    public:
        string longestPalindrome(string s) {
            if(s.length() < 2) return s;
            int max_len = 0;
            string max_len_str = "";
            vector<vector<int>> dp(s.length(), vector<int>(s.length()));
            
            for(int j = 0; j < s.length(); j++){
                dp[j][j] = 1;
                if(max_len == 0) {max_len = 1; max_len_str = s.substr(j, 1);} // case 1 
                for(int i = 0; i < j; i++){
                    if(s[i] == s[j] && (j - i < 2 || (j > 0 && dp[i + 1][j - 1] == 1))){ // case 2 and 3
                        dp[i][j] = 1;
                        if(dp[i][j] == 1 && j - i + 1 > max_len){
                            max_len = j - i + 1;
                            max_len_str = s.substr(i, j - i + 1);
                        }
                    }
                }
            }
            return max_len_str;
        }
    };
    

    2. 中心扩展算法 

    class Solution {
    public:
        string center_expand(string s, int left, int right){
            while(left >= 0 && right < s.length() && s[left] == s[right]){
                left--; right++;
            }
            return s.substr(left + 1, right - left - 1);
        }
        string longestPalindrome(string s) {
            if(s.length() < 2) return s;
            string max_len_str = "", tmp_even_str = "", tmp_odd_str = "";
            for(int i = 0; i < s.length(); i++){
                tmp_even_str = center_expand(s, i, i + 1);
                tmp_odd_str = center_expand(s, i, i);
                if(tmp_odd_str.length() > max_len_str.length()) max_len_str = tmp_odd_str;
                if(tmp_even_str.length() > max_len_str.length()) max_len_str = tmp_even_str;
            }
            return max_len_str;
        }
    };
    

      

  • 相关阅读:
    route命令
    自动删除n天前日志
    ss命令
    rcp命令
    crontab,at命令,常见问题
    locate,nl命令
    kill,killall,top,free,vmstat,iostat,watch命令
    [转载]memcached stats 命令
    Swift学习笔记
    C++移位运算符
  • 原文地址:https://www.cnblogs.com/xlqtlhx/p/11966516.html
Copyright © 2011-2022 走看看