英文题目
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.
给一个字符串 s 找到最长回文子串 在 s 中,你将给字符串最长 1000
Example 1:
Input: "babad"
Output: "bab"
Note: "aba" is also a valid answer.
Example 2:
Input: "cbbd"
Output: "bb"
思路:
思路一: 中心扩展法
从’aba’ 和 ‘aa’ 从数的中间去找最大的子串 中心的可能为 2n-1 n为字符串长
特殊情况 s 为空 或者为 “”
class Solution {
public String longestPalindrome(String s) {
if(s==null || s.length() < 1){
return "";
}
int start = 0, end = 0;
for(int i = 0 ; i < s.length(); i ++) {
int length1 = getPalindrome(s, i, i); //中心就是 i
int length2 = getPalindrome(s, i, i+1);//中心是 i与 i+1 的中间
int len = Math.max(length1, length2);
if(len > end - start){
start = i - (len -1)/2;//-1 是为了考虑 这种 abba 的情况
end = i + len/2;
}
}
return s.substring(start, end + 1);
}
private int getPalindrome(String s, int left, int right){
//left > = 0 的原因是 s.charAt(left) 还要判断 0 而right 只到 s.length() - 1 因此 最后 left 是他的前一个值
while(left >= 0 && right < s.length() && s.charAt(left) == s.charAt(right)){
left--;
right++;
}
return right - left - 1 ;
}
}
思路二: 暴力法
将每一个子串拿出来进行比较
比较算法比较简单 判断左右是否相等
不能通过
class Solution {
public String longestPalindrome(String s) {
if(s==null || s.length() < 1){
return "";
}
int start = 0, end = 1;
int len = s.length();
for(int i = 0; i < len; i++){
for(int j = i+1; j <= len; j++){
String sub = s.substring(i,j);
if(getPalindrome(sub) && j -i > end - start){
end = j;
start = i;
}
}
}
return s.substring(start, end);
}
private boolean getPalindrome(String s){
int len = s.length();
for(int i = 0; i < len /2; i++){
if(s.charAt(i) != s.charAt(len - i -1)){
return false;
}
}
return true;
}
}