0005.最长回文子串
方法一:动态规划
时间复杂度 $O(n^2)$,空间复杂度 $O(n^2)$。
func longestPalindrome(s string) string {
dp, n, ans := make([][]bool, len(s)), len(s), s[:1]
for i := 0; i < n; i++ {
dp[i] = make([]bool, n)
dp[i][i] = true
}
for end := 1; end < n; end++ {
for start := 0; start < end; start++ {
if s[start] == s[end] && (end-start == 1 || dp[start+1][end-1]) {
dp[start][end] = true
if end-start+1 > len(ans) {
ans = s[start : end+1]
}
}
}
}
return ans
}
impl Solution {
pub fn longest_palindrome(s: String) -> String {
let n = s.len();
let mut dp = vec![vec![false; n]; n];
let mut ans = "".to_string();
let arrays = s.as_bytes();
for end in 0..n {
for start in 0..=end {
let (a, b) = (arrays[start], arrays[end]);
if a == b && (end - start <= 2 || dp[start + 1][end - 1]) {
dp[start][end] = true;
if end - start + 1 > ans.len() {
ans = s.get(start..end + 1).unwrap().to_string();
}
}
}
}
ans
}
}
方法二:中心扩展算法
时间复杂度 $O(n^2)$,空间复杂度 $O(1)$。
func palindrome(s string, i, j int) string {
for i >= 0 && j < len(s) {
if s[i] == s[j] {
i, j = i-1, j+1
} else {
break
}
}
return s[i+1 : j]
}
func longestPalindrome(s string) string {
n, ans := len(s), s[:1]
for i := 0; i < n; i++ {
r1, r2 := palindrome(s, i, i), palindrome(s, i, i+1)
if len(r1) > len(ans) {
ans = r1
}
if len(r2) > len(ans) {
ans = r2
}
}
return ans
}