原题链接: 最长回文字符串
给你一个字符串 s,找到 s 中最长的回文子串。
示例 1:
输入:s = “babad”
输出:“bab”
解释:“aba” 同样是符合题意的答案。
示例 2:
输入:s = “cbbd”
输出:“bb”
示例 3:
输入:s = “a”
输出:“a”
示例 4:
输入:s = “ac”
输出:“a”
提示:
1 <= s.length <= 1000
s 仅由数字和英文字母(大写和/或小写)组成
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-palindromic-substring
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
暴力求解中心扩散思想和运筹学中的状态转移实现;
只有对应线上全为TRUE的时候才能保证当前字符子串是回文子串,详解间官方视频教程
语言实现:
package main
import "fmt"
// 官方解答 使用运筹学中的递归
func longestPalindrome2(s string) string {
n := len(s)
ans := ""
dp := make([][]int, n)
for i := 0; i < n; i++ {
dp[i] = make([]int, n)
}
for l := 0; l < n; l++ {
for i := 0; i + l < n; i++ {
j := i + l
if l == 0 {
dp[i][j] = 1
} else if l == 1 {
if s[i] == s[j] {
dp[i][j] = 1
}
} else {
if s[i] == s[j] {
dp[i][j] = dp[i+1][j-1]
}
}
if dp[i][j] > 0 && l + 1 > len(ans) {
ans = s[i:i+l+1]
}
}
}
return ans
}
// 官方解答2 暴力解答
func longestPalindrome(s string) string {
if s == "" {
return ""
}
start, end := 0, 0
for i := 0; i < len(s); i++ {
left1, right1 := expandAroundCenter(s, i, i)
left2, right2 := expandAroundCenter(s, i, i + 1)
if right1 - left1 > end - start {
start, end = left1, right1
}
if right2 - left2 > end - start {
start, end = left2, right2
}
}
// 字符串截取
return s[start:end+1]
}
func expandAroundCenter(s string, left, right int) (int, int) {
for ; left >= 0 && right < len(s) && s[left] == s[right]; left, right = left-1 , right+1 { }
return left + 1, right - 1
}
func main() {
fmt.Println(longestPalindrome("abababhjjh"))
}
CPP代码实现:
//
// Created by andrew on 2021/3/7.
//
#include <iostream>
#include <string>
#include <vector>
using namespace std;
class Solution {
public:
// 官方使用动态规划
static string longestPalindrome(string s) {
int n = s.size();
vector<vector<int>> dp(n, vector<int>(n));
string ans;
for (int l = 0; l < n; ++l) {
for (int i = 0; i + l < n; ++i) {
int j = i + l;
if (l == 0) {
dp[i][j] = 1;
} else if (l == 1) {
dp[i][j] = (s[i] == s[j]);
} else {
dp[i][j] = (s[i] == s[j] && dp[i + 1][j - 1]);
}
cout <<"i = " << i << " j = " << j << " l = " << l << endl;
if (dp[i][j] && l + 1 > ans.size()) {
ans = s.substr(i, l + 1);
}
}
cout << "======================" << endl;
}
return ans;
}
static pair<int, int> expandAroundCenter(const string& s, int left, int right) {
while (left >= 0 && right < s.size() && s[left] == s[right]) {
--left;
++right;
}
return {left + 1, right - 1};
}
// 暴力破解
static string longestPalindrome2(string s) {
int start = 0, end = 0;
pair<int, int> point1, point2;
for (int i =0; i < s.size(); i ++) {
// aba 型
point1 = expandAroundCenter(s, i, i);
// abba 型
point2 = expandAroundCenter(s, i, i + 1);
if(point1.second - point1.first > end - start) {
start = point1.first;
end = point1.second;
}
if (point2.second - point2.first > end - start) {
start = point2.first;
end = point2.second;
}
}
return s.substr(start, end - start + 1);
}
};
int main(int argc, char*argv[]) {
cout << Solution::longestPalindrome("abba") << endl;
cout << Solution::longestPalindrome2("abba") << endl;
return 0;
}