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; }}
- Longest Palindromic Substring 在一个字符串里找最长回文子串@LeetCode
- LeetCode - 5 Longest Palindromic Substring 最长回文子字符串
- 【LeetCode】005 Longest Palindromic Substring 最长的回文子字符串
- Longest Palindromic Substring(最长回文子字符串)
- [LeetCode]Longest Palindromic Substring最长回文字符串
- LeetCode:Longest Palindromic Substring最长回文字符串
- [LeetCode] Longest Palindromic Substring 最长回文子串
- LeetCode Longest Palindromic Substring(最长回文子串)
- [LeetCode]—Longest Palindromic Substring 最长回文子串
- LeetCode | Longest Palindromic Substring(最长回文子串)
- Longest Palindromic Substring [LeetCode] 最长回文子串
- LeetCode OJ 之 Longest Palindromic Substring (最长回文子串)
- [C++]LeetCode: 99 Longest Palindromic Substring (最长回文子串)
- LeetCode Longest Palindromic Substring 最长回文子串
- LeetCode-5 Longest Palindromic Substring(求最长回文子串)
- LeetCode:Longest Palindromic Substring 最长回文子串
- 最长回文子串(LeetCode #5 Longest Palindromic Substring)
- 【LeetCode】5.Longest Palindromic Substring 最长回文子串问题
- Subsets II 求有重复元素的集合的子集 @LeetCode
- LeetCode题解:Minimum Path Sum
- javabean数据库连接池(tomcat上配置)
- #android#基于ubuntu12.04开发环境的搭建
- Nachos _ multi _ programming
- Longest Palindromic Substring 在一个字符串里找最长回文子串@LeetCode
- ubuntu开机运行多条命令
- remove in Linux
- Sort Colors 排序颜色 @LeetCode
- javascript获取url参数的方法
- hdu 4778 Gems Fight!(状压+博弈)
- php随机生成福彩双色球号码
- 在qt下获取屏幕分辨率
- shark0.8.0源码剖析-主流程