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

    一、题目

      1、审题:

        

      2、分析

        求字符串最长的回文子串

    二、解答

      1、分析: 

       方法一:

        依次遍历字符串的字符,同时将该字符作为中间字符,向左右延伸进行比较,选出最长回文子串,此时回文子串有奇数偶数之分,为了方便,可以在所给字符串相隔字符之间均加上字符“#", 从而化为只有奇数的一种情况,最终将所求出的最长回文子串的‘#’处理即可。

      

    class Solution {
        public String longestPalindrome(String s) {
    
            int len = s.length();
            if(len == 1 || len == 0)
                return s;
            int maxLen = 1, start, end, median = 1;
            StringBuffer sb = new StringBuffer("#");
            for (int i = 0; i < len; i++) {
                sb.append(s.charAt(i)).append("#");
            }
            String ss = sb.toString();
            int len2 = ss.length();
            for (int i = 1; i < len2; i++) {
                int result = 1;
                for (start = i - 1, end = i + 1; start >= 0 && end < len2 ; start--, end++) {
                    if(ss.charAt(start) == ss.charAt(end))
                        result += 2;
                    else
                        break;
                }
                if(maxLen < result) {
                    maxLen = result;
                    median = i;
                }
            }
    
            String s2 = ss.substring(median - maxLen/2, median + maxLen/2 + 1);
            return s2.replace("#", "");
    
        }
    }

       

      方法二:

        回文子串分奇数、偶数长度两种情况。

      

    class Solution {
        public String longestPalindrome(String s) {
    
            int len = s.length();
            if(len < 2)
                return s;
    
            int[] arr = new int[]{0,0};     // arr[0] = startIndex, arr[1] = maxLen;
            for (int i = 0; i < len - 1; i++) {
                findLongestPal(s, i, i, arr); // 奇数
                findLongestPal(s, i, i+1, arr); // 回文子串为偶数
            }
    
            return s.substring(arr[0], arr[1] + arr[0]);
        }
    
        public void findLongestPal(String s, int start, int end, int[] arr) {
    
            while(start >= 0 && end < s.length()
                    && s.charAt(start) == s.charAt(end)) {
                end++;
                start--;
            }
    
            if(arr[1] < end - start - 1) {  // 因为 while 中 多走了一步循环
                arr[0] = start + 1;     
                arr[1] = end - start - 1;
            }
        }
    }

        

  • 相关阅读:
    代码书写的细节
    php中的正则函数主要有三个-正则匹配,正则替换
    2个比较经典的PHP加密解密函数分享
    淘宝运营中的6大致命误区,你犯过么?
    30分钟教你写出10分的淘宝标题
    超全的web开发工具和资源
    转化率不好?告诉你转化飙秘诀
    帮你店铺日销千单的20个淘宝小技巧
    不刷单,中小卖家如何提升店铺流量?
    使用Flexible实现手淘H5页面的终端适配
  • 原文地址:https://www.cnblogs.com/skillking/p/9384233.html
Copyright © 2011-2022 走看看