您的位置:首页 > 其它

Longest Palindromic Substring 在一个字符串里找最长回文子串@LeetCode

2013-11-10 07:02 711 查看
题目是不难(思路好想),但要细心写才不会错!特别注意到有偶数个和奇数个palindrome的情况,以及两者的优先级不同!
对每个字符,看看它的左边和右边是不是相等(奇数)
或者它自己和右边是否相等(偶数)

另:我专门写一篇文章总结这道题:http://blog.csdn.net/fightforyourdream/article/details/21309759

package Level4;

/**
* 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.
*
*/
public class S5 {

public static void main(String[] args) {
String s = "abbbbda";
System.out.println(longestPalindrome(s));
}

public static String longestPalindrome(String s) {
if(s.length() == 0){
return "";
}
int maxDiff = 0;
int maxIndex = 0;
int len = s.length();
boolean odd = true; // 默认是奇数个palindrome(即没有palindrome的情况也属于奇数)

// 先测试palindrome是偶数情况,因为我默认"aa"和"a"都是diff为0的情况,这时palindrome为偶数的更长一些,所以给偶数更高优先级
for(int i=0; i<len; i++){
int diff = 0;
if(i+1<len && s.charAt(i)==s.charAt(i+1)){ // Even
diff = 0;
while(i-diff>=0 && i+1+diff<len && s.charAt(i-diff)==s.charAt(i+1+diff)){
diff++;
}
if(diff-1 >= maxDiff){ // 给偶数更高优先级(尽量找偶数个palindrome)
maxDiff = diff-1;
maxIndex = i;
odd = false;
}
}

// 再测试palindrome是奇数个情况,只有当奇数palindrome的diff超过(不能一样)偶数palindrome的diff时,才采纳
diff = 0; // Odd
while(i-diff>=0 && i+diff<len && s.charAt(i-diff)==s.charAt(i+diff)){
diff++;
}
if(diff-1 > maxDiff){
maxDiff = diff-1;
maxIndex = i;
odd = true;
}

}

// System.out.println("maxDiff:" + maxDiff);
if(odd){ // 奇数个palindrome
// System.out.println("odd");
return s.substring(maxIndex-maxDiff, maxIndex+maxDiff+1);
}else{ // 偶数个palindrome
// System.out.println("even");
return s.substring(maxIndex-maxDiff, maxIndex+maxDiff+2);
}

}

}

采用中心展开法:
public class Solution {
public String longestPalindrome(String s) {
if(s.length() == 0) {
return s;
}
int max = 0;
String maxs = s;
for(int i=0; i<s.length(); i++) {
int p = i;
int dist = 0;
while(p-dist >= 0 && p+dist < s.length() && s.charAt(p-dist) == s.charAt(p+dist)) {
dist++;
}
dist--;
int len = (i+dist) - (i-dist) + 1;
if(len > max) {
max = len;
maxs = s.substring(i-dist, i+dist+1);
}

p = i;
dist = 0;
while(i-dist >= 0 && i+1+dist < s.length() && s.charAt(i-dist) == s.charAt(i+1+dist)) {
dist++;
}
dist--;
len = (i+1+dist) - (i-dist) + 1;
if(len > max) {
max = len;
maxs = s.substring(i-dist, i+1+dist+1);
}
}

return maxs;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: