Given a string s, find the longest palindromic substring in s. You may assume that the maximum length of s is 1000.
Example:
Input: "babad"
Output: "bab"
Note: "aba" is also a valid answer.
Example:
Input: "cbbd"
Output: "bb"
publicclassSolution {public String longestPalindrome(String s) {
int longest_length = 0;
int begin = 0;
int end = 0;
int len = s.length();
for (int i = 0; i < len; i++){
for (int j = i; j < len; j++){
//更新最长回文串长度并记录开始和结束的位置if (isPalindrome(s.substring(i, j + 1)) && (j - i + 1 ) > longest_length){
begin = i;
end = j + 1;
longest_length = j - i + 1;
}
}
}
return s.substring(begin, end);
}
//判断是不是回文串privatestaticbooleanisPalindrome(String s){
for (int i = 0; i < s.length() / 2; i++){
if (s.charAt(i) != s.charAt(s.length() - i - 1)){
returnfalse;
}
}
returntrue;
}
}
思路二代码:
publicclassSolution {public String longestPalindrome(String s) {
int i, j;
int begin = 0;
int end = 0;
int max_len = 0;
int cur_len = 0;
int s_len = s.length();
for (i = 0; i < s_len; i++){ // the middle point of palindromefor (j = 0; (i - j >= 0) && (i + j < s_len); j++){ // if the length of palindrome is oddif (s.charAt(i - j) != s.charAt(i + j)){
break;
}
cur_len = j * 2 + 1;
}
if (cur_len > max_len){
max_len = cur_len;
begin = i - j + 1;
end = i + j;
}
for (j = 0; (i - j >= 0) && (i + j + 1 < s_len); j++){ // if the length of palindrome is even if (s.charAt(i - j) != s.charAt(i + j + 1)){
break;
}
cur_len = j * 2 + 2;
}
if (cur_len > max_len){
max_len = cur_len;
begin = i - j + 1;
end = i + j + 1;
}
}
return s.substring(begin, end);
}
}
思路三代码:
publicclassSolution {public String longestPalindrome(String s) {
s = formatString(s);
int[] radius = newint[s.length()]; // The left radius of palindrome in every positionint pos = 0;
int max_right = 0;
int max_len = 0;
int begin = 0;
int end = 0;
for (int i = 0; i < s.length(); i++){
if (i < max_right){
radius[i] = Math.min(radius[2 * pos - i], max_right - i);
} else {
radius[i] = 1;
}
while (i - radius[i] >= 0 && i + radius[i] < s.length() && (s.charAt(i - radius[i]) == s.charAt(i + radius[i]))){
radius[i]++;
}
if (i + radius[i] - 1 > max_right){
max_right = i + radius[i] - 1;
pos = i;
}
if (radius[i] - 1 > max_len){
max_len = radius[i] - 1;
begin = i - (radius[i] - 1);
end = i + radius[i];
}
}
return s.substring(begin, end).replace("#", "");
}
// Format the original string like "abc" to "#a#b#c#" for exampleprivatestatic String formatString(String s){
StringBuffer sb = new StringBuffer("#");
for (int i = 0; i < s.length(); i++){
sb.append(s.charAt(i) + "#");
}
return sb.toString();
}
}