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

    题目:最长回文子串

    问题描述:

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

    解决思路:

    本题可以采用中心扩展算法:顾名思义,由于回文串具有中心对称的性质,所以我们可以根据字符串中的某一个字符开始分别向左向右扩展,直到找到不相等的字符为止,这样得到的字符串即是能够得到的最长回文串。

    我们应该注意,当回文串的长度是偶数时,中心有n-1个;而当回文串的长度是奇数时,中心就有n个(n为回文串的长度):

    解决代码:

    
    class Solution {
        public static String longestPalindrome(String s) {
            if (s.length() < 2) {
                return s;
            }
    
            // 最长回文子串长度
            int maxLen = 0;
            // 回文子串中心
            int center = 0;
            for (int i = 0; i < s.length(); i++){
                // 最长回文串长度为奇数
                int begin = centerExpand(s, i, i);
                // 最长回文串长度为偶数
                int end = centerExpand(s, i, i + 1);
    
                if (maxLen < Math.max(begin, end)){
                    center = i;
                    maxLen = Math.max(begin, end);
                }
            }
            // 如果回文子串的长度为偶数,那么中心左边的长度会比右边的长度小1
            return s.substring(center - (maxLen - 1) / 2, center + maxLen / 2 + 1);
        }
    
        private static int centerExpand(String s, int begin, int end){
            while (begin >= 0 && end < s.length() && s.charAt(begin) == s.charAt(end)){
                begin--;
                end++;
            }
            // 返回以begin和end为基准,同时向左向右扩展后能够得到的最长回文串长度
            return end - begin - 1;
        }
    }
    
  • 相关阅读:
    OneSQL安装
    Dropbox可伸缩性设计最佳实践分享
    软件开发实践的24条军规
    最精彩的英语学习经验总结:俺的英语之路
    Facebook和Google如何激发工程师的创造力
    十种更好的表达“你的代码写的很烂”的方法
    一次java程序的重构
    漂亮代码
    一段代码引发的思考
    最难忘的Bug调试经历
  • 原文地址:https://www.cnblogs.com/syhyfh/p/13188153.html
Copyright © 2011-2022 走看看