题目描述
给定一个字符串 s
,找到 s
中最长的回文子串。你可以假设 s
的最大长度为 1000。
示例 1:
输入: "babad"
输出 : "bab"
注意 : "aba" 也是一个有效答案。
示例 2:
输入: "cbbd" 输出: "bb"
最简单的办法就是进行穷举搜索输入字符串的每一个字串,并进行逐一判断其是否为回文字符串。
// cpp.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include <iostream>
#include<string>
using namespace std;
string longestPalindrome(string s);
int main(){
string s;
//cin >> s;
cout << longestPalindrome("abcdedcba");
}
string longestPalindrome(string s) {
string temp = "", record = "";
int flag = 1;
for (int i = 0; i < s.size(); i++) {
for (int j =1; j <= s.size()-i; j++) {
temp = s.substr(i, j);
for (int k = 0; k < temp.size() / 2; k++) {
if (temp[k] != temp[temp.size() - 1 - k]) {
flag = 0;
break;
}
}
if (flag == 1) {
if(record.size()<temp.size())
record = temp;
}
flag = 1;
}
}
return record;
}
// 运行程序: Ctrl + F5 或调试 >“开始执行(不调试)”菜单
// 调试程序: F5 或调试 >“开始调试”菜单
另外就是使用动态规划
我们给出 的定义如下:
如果是回文串为真,否则为假。
基本示例如下:
P(i, i) = true
这产生了一个直观的动态规划解法,我们首先初始化一字母和二字母的回文,然后找到所有三字母回文,并依此类推…
#include<iostream>
#include<string>
#include<vector>
using namespace std;
string longestPalindrome(string s);
int main() {
string s;
cout << longestPalindrome("abcddcba");
}
string longestPalindrome(string s) {
int m = s.length();
vector<vector<bool>> p(m);
for (int i = 0; i < m; i++)
p[i].resize(m);
for (int i = 0; i < m; i++) {
for (int j = 0; j < m; j++) {
p[i][j] = false;
}
}
for (int i = 0; i < m; i++) {
p[i][i] = true;
if(i<m-1)
p[i][i + 1] = (s[i] == s[i + 1]);
}
int Begin = 0, MaxLength = 0;
for (int r = 3; r <= m; r++) {
for (int i = 0; i <= m - r; i++) {
int j = i + r - 1;
p[i][j] = p[i + 1][j - 1] && (s[i] == s[j]);
if (p[i][j]) {
if (MaxLength < r) {
Begin = i;
MaxLength = r;
}
}
}
}
for (int i = 0; i < m; i++) {
for (int j = 0; j < m; j++) {
cout << p[i][j]<<" ";
}
cout << endl;
}
return s.substr(Begin, MaxLength);
}
下面加入了可能为一个或者两个字符的情况。
string longestPalindrome(string s) {
int n = s.length();
if (n == 0)
return "";
vector<vector<bool>> p(n);
for (int i = 0; i < n; i++) {
p[i].resize(n);
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
p[i][j] = false;
}
}
int start = 0;
int maxLength = 1;//默认为一个字符
for (int i = 0; i < n; i++) {
p[i][i] =true;
if (i < n - 1) {
p[i][i + 1] = s[i] == s[i + 1];
if (p[i][i + 1]) {
start = i;
maxLength = 2;
}
}
}
for (int l = 3; l <= n; l++) {//子串的长度
for (int i = 0; i <= n - l; i++) {//子串的起始位置
int j = i + l - 1;//子串的结束位置
p[i][j] = p[i + 1][j - 1] && (s[i] == s[j]);
if (p[i][j]) {
if (maxLength < l) {
start = i;
maxLength = l;
}
}
}
}
return s.substr(start, maxLength);
}