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; } }
时间: 2024-10-26 08:26:43