5. Longest Palindromic Substring
- Total Accepted: 121867
- Total Submissions: 515479
- Difficulty: Medium
题目描述:
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
Hide Similar Problems
Have you met this question in a real interview?
No
Thanks for your feedback.
题目思路:
从头开始遍历字符串,该字符的前后两个字符相等,则继续比较前面与后面的字符串,直到比较出不相等或者是到达了字符串的边界,记录此长度,若是比当前的最大记录大则 替换最大值。
代码如下:
package cn.edu.bupt;
/**
* Created by jiaochenchen on 2016/8/4.
*/
public class LongestPalindromicSubstring_5 {
public String longestPalindrome(String s) {
if(s==null||s.length()==0){return "";}
if(s.length()==1){return s;}
int len=s.length();
int maxlen=0;
int start=0;
int end=0;
for(int index=0;index<len;index++){
if(index<len&&((index-1)>=0&&index+1<len&&s.charAt(index-1)==s.charAt(index+1))||((index+1)<len&&s.charAt(index+1)==s.charAt(index))){
if(index-1>=0&&s.charAt(index-1)==s.charAt(index+1)){
int i=index-1;
int j=index+1;
int tempmaxlen=1;
while(i>=0&&j<len&&s.charAt(i)==s.charAt(j)){
tempmaxlen+=2;
if(tempmaxlen>maxlen){maxlen=tempmaxlen;start=i;end=j;}
j++;i--;
}
}
if(s.charAt(index)==s.charAt(index+1)){
int i=index;
int j=index+1;
int tempmaxlen=0;
while(i>=0&&j<len&&s.charAt(i)==s.charAt(j)){
tempmaxlen+=2;
if(tempmaxlen>maxlen){maxlen=tempmaxlen;start=i;end=j;}
j++;i--;
}
}
}
}
System.out.println(start);
System.out.println(end);
return s.substring(start,end+1);
}
别人的高级代码,比我的代码高端在了在处理重复元素上,直接越过重复的元素,而不是处理每一个与前面相同的元素,而且设置了j元素,守在最初的i位置上,代码十分优雅
<pre name="code" class="cpp">string longestPalindrome(string s) {
if (s.empty()) return "";
if (s.size() == 1) return s;
int min_start = 0, max_len = 1;
for (int i = 0; i < s.size();) {
if (s.size() - i <= max_len / 2) break;
int j = i, k = i;
while (k < s.size()-1 && s[k+1] == s[k]) ++k; // Skip duplicate characters.
i = k+1;
while (k < s.size()-1 && j > 0 && s[k + 1] == s[j - 1]) { ++k; --j; } // Expand.
int new_len = k - j + 1;
if (new_len > max_len) { min_start = j; max_len = new_len; }
}
return s.substr(min_start, max_len);
}