LeetCode【5】. Longest Palindromic Substring --思路图解与java实现

Longest Palindromic Substring

一、题目如下:

       Given a string S, find the longest palindromic substring in S. You may assume that the maximum length of S is 1000, and there exists one unique longest palindromic substring.
      题目要求给定字符串的最大对称子字符串,如“aaabccbacc”的最大对称子字符串为“abccba”。

二、思路:

      以每个字符或两个字符的中间作为中心向两边比较过去,并判断是否为对称子字符。思路很简单,两种情况示意图如下:
LeetCode【5】. Longest Palindromic Substring --思路图解与java实现_第1张图片
图一、两种对称情况示意图
      如图,对于对称字符串,可能出现如上两种情况。一种为A“偶对称”,以中隔线互相对称;另一种为B“奇对称”,以中间一字符为中心对称。通过i从0一直扫向字符串的尾部,每次前进0.5,并以i为中心,向两端扫去进行判断。时间复杂度为O(n^2),最坏情况为整个字符串所有字符相同,那么每次扫都得扫到尽头。

三、Java程序

public class Solution {
    public String longestPalindrome(String s) {
        int down = 0,up = 0,count = 0;   //分别记录扫字符串时的上下区间及字符串长度
        int sl = s.length();
        int maxl = 0;
        int subDown = 0, subUp = 0;      //目标子字符串的上下区间
        String subS = new String("");
        
        if(sl==0)
        	return "";
        //1. 找出目标子字符串的中间位置及上下限
        for(double i=0; i<=sl-1; i=i+0.5)
        {
            down = (int)Math.floor(i);
            up = (int)Math.ceil(i);
            if((i%1==0.5)&&sl!=0)        //判断i所属情况(A或B)
            {
              count = 0;
            }else                     
            { 
              count = 1;
              down--;
              up++;
            }
        
        //2. 以i为中心向两边扫描
            while(!(down<0||up>sl-1))
            {
               if(s.charAt(down)!=(s.charAt(up)))
               {
                   break;                //2.1. 当以i为中心对称的俩字符不相等则跳出扫描
               }else{                    //2.2. 当以i为中心对称的俩字符相等则继续分别向两边移动
                  count+=2;
                  down--;
                  up++;
                }
            }
            
        //3. 更新最长字符串 
            if(count>maxl)             
            {
                maxl = count;
                subDown = down;
                subUp = up;
            }
        }
        //3.1 由于在扫描时,先移动后再判断,停止时其实前后都多移动了一个单位,这里进行一个单位的恢复
        subDown++;
        subUp--;
        subS = s.substring(subDown,subUp+1);
       
    return subS;//返回对称子字符串
    }
}


扩展学习:该文章介绍了几种方法Java Longest Palindromic Substring(最长回文字符串)

           Leetcode – Longest Palindromic Substring (Java)





你可能感兴趣的:(LeetCode-Java,leetcode,java,算法,数据结构,substring)