LeetCode题解 #5 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.

在给定一个字符串S中,找到最长的回文串。

很恶心的一道题,不过应该都能想到枚举,从第一个开始枚举。枚举的字母向两头延伸,如果相同则继续,不同则开始下一个枚举。用一个全局变量来保存最长的字符串。

不过用JAVA的话,还是别用String这个类所提供的函数了,因为很耗时。主要体现在构建和取子串这个地方。所以我把S弄成了一个数组。

还有一点要注意的事,回文串存在奇数和偶数的情况。比如bab,这样枚举到a就能找到。但如果是baab呢?他也是回文串,但用枚举的方法就会出问题。

一个解决办法就是在字符串中加入一个通用的符号,每隔一个字符加一个,这样就能保证是奇数了。比如b#a#b,b#a#a#b。可以用枚举。

一定要在字符的开头和末位加入#,不然有可能找到同样长的子串。a#b#c#c  会找到 #b# 和 c#c

因为题目说要找回文串,所以肯定能找到一个回文串的,也不会找到同样长的。这点不用担心。

思路:

1、把字符串弄成数组,过程中加入#号。

2、然后每个字符枚举,向两边延伸。

3、记录当前最长的回文串,注意不用取子串。用数组下标。

4、找到最长的回文串,去掉#。

public class Solution {
    
	public String longestPalindrome(String s) {
		
		
	       
	       
	       String longest_string = "";
	       
	       int max = 0;
	       int max_left = 0;
	       int max_right = 0;
	       
	       
	       //是在两个字母之间填一个# 使得整个字符串都为奇数
	       
	       	String s_temp = "";
	       	
	       	int n = s.length();
	       	
	       	
	       	
	       	char [] temp = new char[n+n+1];
	   	
	   		for(int i=1,j=0;j<n;j++,i+=2){
	   			
	   			temp[i]=s.charAt(j);
	   		}
	   		
	   		for(int i=0;i<n+n+1;i+=2){
	   			
	   			temp[i] = '#';
	   			
	   		}
	   		
	   		//查看数组
	   		/*
	   		for(int i=0;i<n+n+1;i++)
	   			System.out.println(temp[i]);
	   		*/
	   		
	   		n = n+n+1;
	   	
	   	    
	       
	       for(int i=0;i<n;i++){
	    	   
	    	   //System.out.println("begin"+i);
    		   
	    	   
	    	   int left = i;
	    	   int right = i;
	    	   
	    	   
	    	   
	    	   //从该点延伸
	    	   while(left>0&&right<n-1&&temp[left-1]==temp[right+1]){
	    		   
	    		   left--;
	    		   right++;
	    		   
	    	   }
	    	   
	    	   
	    	   
	    	   //如果该点得到的回文串比上一次长
	    	   if(right-left+1>=max){
	    	       
	    	       max = right-left+1;
	    		   
	    		   //记下这个时候的left 和 right即可
	    	       
	    	       max_left = left;
	    	       max_right = right;
	    	       
	    	       
	    		   
	    		   
	    		   
	    	   }
	    	   
	    	   
	    	   
	    	   
	       }
	       
	       /*
	       System.out.println(max_right);
	       System.out.println(max_left);
	       
	       System.out.println(temp[max_right]);
	       System.out.println(temp[max_left]);
	       */
	       
	       
	       String result = "";
	       
	       //将left和right段的字符加起来
	       for(int i=max_left;i<=max_right;i++){
	    	   
	    	  if(temp[i]!='#'){
	    		  
	    		  
	    		  //System.out.println(temp[i]);
	   	       		
	    		  result += temp[i];
	    	  }
	    	   
	       }
	    	   
	       
	       
	       return result;
	           
	        
	    }
}

  

原文地址:https://www.cnblogs.com/wzben/p/5276488.html