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

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

    示例 1:

    输入: "babad"
    输出: "bab"
    注意: "aba" 也是一个有效答案。
    

    示例 2:

    输入: "cbbd"
    输出: "bb"

    1、中心扩展法
    class Solution {
        public String longestPalindrome(String s) {
            //中心扩展法
            int start = 0,end = 0;       
            if(s == null || s.length() == 0) return "";
            for(int i = 0;i < s.length();i++){
                int len1 = expand(s,i,i);
                int len2 = expand(s,i,i + 1);
                int len = Math.max(len1,len2);
                if(len > end - start +1){
                    start = i - (len - 1) / 2;
                    //len / 2
                    end = i + len / 2;
                }
            }
            return s.substring(start,end + 1);
        
        }
      
        private int expand(String s,int i,int j){
            int len = 1;
            int l = i,h = j;
                while(i >= 0 && j < s.length() && s.charAt(i) == s.charAt(j)){
                    len = (j - i + 1 > len) ? (j - i + 1) : len;
                    i--;
                    j++;
                     
                }
            return len;
            
        }
    }

    2、Manacher

    class Solution {
        public String longestPalindrome(String s) {
            //Manacher
            String manacherStr = getManacherStr(s);
            char[] charArray = manacherStr.toCharArray();
            int[] pArray = new int[charArray.length];  
            int pR = -1;
            int index = -1;
            
            int max = 0;
            int start = 0;
            for(int i = 0;i < charArray.length;i++){
                //首先判断是否在最远边缘内部
                //pArray[2 * idnex - i]处的半径
                pArray[i] = i < pR ? Math.min(pR - i,pArray[2 * index - i]) : 1;
                while(i + pArray[i] < charArray.length && i - pArray[i] >= 0){
                    if(charArray[i + pArray[i]] == charArray[i - pArray[i]]){
                        pArray[i]++;
                    }else{
                        break;
                    }
                }
                //更新最右边缘与其index
                if(i + pArray[i] > pR){
                    pR = i + pArray[i];
                    index = i;
                }
                //更新起始位置
                if(pArray[i] > max){
                      max = pArray[i];
                      start = (i - max + 1) / 2;
                }
            }
            //max为真实长度 - 1
            return s.substring(start,start + max - 1); 
        }
    
        private String getManacherStr(String s){
            String res = "#";
            for(int i = 0;i < s.length();i++){
                res += s.charAt(i) + "#";
            }
            return res;
        } 
    }
    一回生,二回熟
  • 相关阅读:
    vs已停止工作
    2.3.4 工具运行和错误解决方法
    vs2010 :0X80041FEB 程序集无法修改版等内容
    VS2010 F5调试时出现:“ 尝试运行项目时出错:未捕获通过反射调用的方法引发的异常”解决
    栅格计算器中空间分析函数
    设备系统,个人消费系统
    知己知彼
    ASP.NET MVC 实现二级域名
    自定义ASP.NET MVC Html辅助方法
    MVC系统过滤器(局部缓存,局部动态)
  • 原文地址:https://www.cnblogs.com/zzytxl/p/12653836.html
Copyright © 2011-2022 走看看