1 题目理解
Longest Palindromic Substring
这道题是ACM一众的在线编程OJ系统里面的常客,最长回文串。很多题目都和这道题十分的类似,因此也具有很强的参考性和经典型。
什么事回文串呢?其实也就是一个字符串,正着反着看他的字符,都是一样的,比如aacc,abba之类的。
最长回文串的求解法很多,比如说最简单的就是直接开for循环在最外层,然后里面再嵌套一个顺序相反的for循环,如果两个字符相同,那么久继续比较他们中间的字符,检查是否构成回文串。
这种做法比较费时,因此我使用的则是另外一种判别方法,即从中心判别。
对于长度为奇数的回文串,我们从中间为标准(这里是一个字符),其两边距离相同位置的字符是一致的,而对于偶数的,那么也是以中间为标准(这里的中间并不是一个字符了,只是一个概念了,主义了)。那么我们最外层依然一个for循环,在每个位置,就认为他是一个中心,然后以偶数和奇数的长度两种情况去检查是否构成回文串就可以了
2 原题
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.
Subscribe to see which companies asked this question
3 AC解
/**
* 这题有很多方法,这里采用中心法,分为奇数和偶数
* 奇数:从当前位置向两边检查,是否是回文串
* 偶数:选择两个位置进行检查,是否是回文串
* */
public class Solution {
char chars[];
String S;
int max=0;
int length;
int maxStart=0,maxEnd=0;
//检查奇数的
public void checkOdd(int mid){
int start=mid-1;
int end=mid+1;
while(start>=0 && end<length && chars[start]==chars[end]){
//构成回文串
start--;
end++;
}
//恢复
start++;
end--;
if(end-start+1 > max){
max=end-start+1;
this.maxStart=start;
this.maxEnd=end;
}
}
//检查奇数的
public void checkEven(int mid1,int mid2){
int count = 0;
int start=mid1;
int end=mid2;
while(start>=0 && end<length && chars[start]==chars[end]){
//构成回文串
start--;
end++;
count+=2;
}
start++;
end--;
if(count > max){
max=count;
this.maxStart=start;
this.maxEnd=end;
}
}
public String longestPalindrome(String s) {
this.S=s;
this.chars=s.toCharArray();
this.length=s.length();
for(int i=0;i<s.length();i++){
checkOdd(i);
}
for(int i=1;i<s.length();i++){
checkEven(i-1,i);
}
return s.substring(maxStart,maxEnd+1);
}
}
最后:PS 我也并不是严格的按照顺序来的。。。第六题我还没做。。但是后面却已经做了好多了。。只是有点强迫症,想顺着更新。。这就去做