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.
自己只想到了O(n2)的算法,遍历每个字符,然后从中间向两旁扩,寻找最长子串。显示的结果一直是pending...
http://www.felix021.com/blog/read.php?2040有O(n)的算法
public
class
Solution {
public
String longestPalindrome(String s) {
// Start typing your Java solution below
// DO NOT write main() function
StringBuilder sb =
new
StringBuilder();
sb.append(
'#'
);
for
(
int
i =
0
; i < s.length(); i++)
{
sb.append(s.charAt(i));
sb.append(
'#'
);
}
String ss = sb.toString();
int
[] p =
new
int
[ss.length()];
int
mx =
0
;
int
id =
0
;
for
(
int
i =
0
; i < ss.length(); i++)
{
p[i] = mx > i ? Math.min(p[id *
2
-i], mx - i) :
1
;
while
(i+p[i] < ss.length() && i - p[i] >=
0
)
{
if
(ss.charAt(i + p[i]) == ss.charAt(i-p[i]))
{
p[i]++;
}
else
{
break
;
}
}
if
(i + p[i] > mx)
{
mx = i + p[i];
id = i;
}
}
// process result
int
maxIndex =
0
;
int
maxLen =
0
;
for
(
int
i =
0
; i < ss.length(); i++)
{
if
( p[i] > maxLen)
{
maxLen = p[i];
maxIndex = i;
}
}
StringBuilder r =
new
StringBuilder();
for
(
int
i = maxIndex - p[maxIndex] +
1
; i <= maxIndex + p[maxIndex] -
1
; i++)
{
if
(ss.charAt(i) !=
'#'
)
{
r.append(ss.charAt(i));
}
}
return
r.toString();
}
}