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

来源:互联网 发布:淘宝运费险是卖家赔吗 编辑:程序博客网 时间:2024/05/04 08:06

题目是不难(思路好想),但要细心写才不会错!特别注意到有偶数个和奇数个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)){// Evendiff = 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;// Oddwhile(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;    }}







原创粉丝点击