zoukankan      html  css  js  c++  java
  • 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;
    	           
    	        
    	    }
    }
    

      

  • 相关阅读:
    MD5算法MFC实现
    asp.net2.0新特点
    file format
    C专家编程第二章学习笔记
    Bye Czech golden generation
    中间层
    学完谭C之后
    C语言学习之路
    荀子劝学篇
    C语言常用转义字符表
  • 原文地址:https://www.cnblogs.com/wzben/p/5276488.html
Copyright © 2011-2022 走看看