zoukankan      html  css  js  c++  java
  • LeetCode——最长连续回文串

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

    给出一个字符串S,找到一个最长的连续回文串。你可以假设s的最大长度是1000。

    Example:

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

    Example:

    Input: "cbbd"
    
    Output: "bb"

    动态规划:

     1 class Solution {
     2 public:
     3     string longestPalindrome(string s) {
     4         if (s.empty()) return "";
     5         if (s.size() == 1) return s;
     6         
     7         int min_start = 0;
     8         int max_len = 1;
     9         int n = s.size();
    10         for (int i = 0; i < n;) {
    11             int j = i, k = i;
    12             while (k < n-1 && s[k] == s[k+1]) {//k——k+1表示相等的同一个元素
    13                 k++;                        
    14             }
    15             i = k + 1;
    16             while (k < n-1 && s[k+1] == s[j-1] && j > 0) {//j-1——k+1为对称相等的元素
    17                 ++k;
    18                 --j;
    19             }
    20             
    21             int new_len = k - j + 1;//当前回文串大小
    22             if (new_len > max_len) {
    23                 min_start = j;
    24                 max_len = new_len;
    25             }
    26         }
    27         return s.substr (min_start, max_len);
    28     }
    29 };
    View Code

    ?Manacher’s Algorithm算法

     用 mx 记录之前计算的最长的回文子串长度所能到达的最后边界,用 id 记录其对应的中心,可以利用回文子串中的回文子串信息。

     1 class Solution {
     2 public:
     3     string longestPalindrome(string s) {
     4         string t ="$#";
     5         for (int i = 0; i < s.size(); ++i) {
     6             t += s[i];
     7             t += '#';
     8         }
     9         int p[t.size()] = {0}, id = 0, mx = 0, resId = 0, resMx = 0;
    10         for (int i = 0; i < t.size(); ++i) {
    11             p[i] = mx > i ? min(p[2 * id - i], mx - i) : 1;
    12             while (t[i + p[i]] == t[i - p[i]]) ++p[i];
    13             if (mx < i + p[i]) {
    14                 mx = i + p[i];
    15                 id = i;
    16             }
    17             if (resMx < p[i]) {
    18                 resMx = p[i];
    19                 resId = i;
    20             }
    21         }
    22         return s.substr((resId - resMx) / 2, resMx - 1);
    23     }
    24 };
    View Code
  • 相关阅读:
    NHibernate 过滤器(第十五篇)
    NHibernate 存储过程 第十四篇
    NHibernate 操作视图 第十三篇
    NHibernate Linq查询 扩展增强 (第九篇)
    NHibernate 之数据操作 (第五篇)
    NHibernate之一级缓存(第十篇)
    jQueryEasyUI
    linux的systemctl 命令用法 转
    linux dig命令 转
    OPTAUTH 两步验证详解
  • 原文地址:https://www.cnblogs.com/thunder-wu/p/7120453.html
Copyright © 2011-2022 走看看