• 【LeetCode5】Longest Palindromic Substring★★


    1.题目描述:

    2.解题思路:

      题意:求一个字符串的最长回文子串。

      方法一:中心扩展法。遍历字符串的每一个字符,如果存在回文子串,那么中心是某一个字符(奇数)或两个字符的空隙(偶数),然后分两种情况(奇数或偶数)向两边扩展。本文主要介绍这种方法。

      因为回文字符串是以中心轴对称的,所以如果我们从下标 i 出发,用2个指针向 i 的两边扩展判断是否相等,那么只需要对0到len-1的下标都做此操作,就可以求出最长的回文子串。但需要注意的是,回文字符串有奇偶对称之分,即"abcba"与"abba"2种类型,因此需要在代码编写时都做判断。
         设函数void extendPalindrome(String s, int j, int k)是求由下标 j和 k 向两边扩展的回文串的最大长度,那么对0至ken-1的下标,调用2次此函数,即可求得以i 下标为奇回文和偶回文的最大子串长度。

         该方法时间复杂度为O(n^2),空间复杂度O(1)。

      方法二:动态规划法。暂不介绍,详情见http://www.programcreek.com/2013/12/leetcode-solution-of-longest-palindromic-substring-java/

    3.Java代码:

     1 //public class LeetCode 为测试代码
     2 public class LeetCode {
     3     public static void main(String[] args) {
     4        String s="babad";
     5        System.out.println(s+"的最长回文子串是:"+new Solution().longestPalindrome(s));
     6         }
     7 }
     8 
     9 //class Solution为ac代码
    10 class Solution {
    11     private static int low;//回文子串的起始位置
    12     private static int maxLen;//回文子串的最大长度
    13     public String longestPalindrome(String s) {
    14         int len=s.length();
    15         if(len<2) return s;
    16         for(int i=0;i<len;i++){
    17             extendPalindrome(s,i,i);//回文子串是奇数的情况
    18             extendPalindrome(s,i,i+1);//回文子串是偶数的情况
    19         }
    20         return s.substring(low, low+maxLen);
    21     }
    22     private static void extendPalindrome(String s, int j, int k) {
    23         while(j>=0&&k<s.length()&&s.charAt(j)==s.charAt(k)){
    24             j--;
    25             k++;
    26         }
    27         if(maxLen<k-j-1){
    28             low=j+1;
    29             maxLen=k-j-1;
    30         }
    31         
    32     }
    33 }

    测试结果:

  • 相关阅读:
    天梯赛练习2 补题
    QFNU 天梯赛练习 1 补题
    2019 山东省赛 B 题
    CCPC2020 网络赛 总结
    一个比较好看的 Typora 主题
    〔OS〕磁盘调度算法
    〔OS〕页面置换算法
    〔OS〕多线程模拟实现生产者和消费者
    〔OS〕银行家算法
    LCS and LIS
  • 原文地址:https://www.cnblogs.com/zhangboy/p/6505496.html
Copyright © 2020-2023  润新知