zoukankan      html  css  js  c++  java
  • Leetcode(5) 最长回文子串

    给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。

    回文串:正反都一样的字符串


    分析:

    以每个字符为中心,判断每个字符左右是否相等,时间复杂度为O(n*n)

    但要注意字符个数的奇偶情况,偶数个就以中间两个字符作为中心,奇数个就以一个字符作为中心

    class Solution {
    public:
        
        void equal(string s,int l,int r,int &start,int &maxlen){
            int len = s.size();
            while(l>=0 && r<=len-1 && s[r]==s[l]){
                    l--;r++;
                }            
                if(maxlen<r-l-1){
                    maxlen = r-l-1;
                    start = l+1;
                }
        }
        
       
        string longestPalindrome(string s) {
            int len = s.size();
            int r,l;
            int start=0,maxlen=0;
            if(len<=1) return s;    
            
            for(int i=0;i<len-1;i++){
                l = i;r = i;
                equal(s,l,r,start,maxlen);
                l = i;r = i+1;
                equal(s,l,r,start,maxlen);            
            } 
            
            return s.substr(start,maxlen);
       }       
    };

    解法2:动态规划,

    对于[i,j]区间内为回文串,dp[i][j] = 1,有

    • i = j ,一个字符肯定有dp[i][j] = 1
    • i = j-1,dp[i][j] = (s[i]==s[j])
    • i > j-1,dp[i][j] = s[i]==s[j]  && dp[i+1][j-1]

    解法3:马拉车算法Manacher's Algorithm

  • 相关阅读:
    JFreeChart生成图片
    itext生成Word
    itext生成PDF
    物理模型name与comment互相转化
    表单序列化为Json(只限input)
    c#多线程同步之EventWaitHandle的应用
    C#多线程之异步编程
    Java环境变量设置
    sharepoint 2013实践
    WPF研究之道——数据驱动UI
  • 原文地址:https://www.cnblogs.com/lemon333333/p/10311167.html
Copyright © 2011-2022 走看看