1. 题目一:
/*
题目:Leetcode 5 最长回文子串
题目描述:
给你一个字符串 s,找到 s 中最长的回文子串。
如果字符串的反序与原始字符串相同,则该字符串称为回文字符串。
示例 1:
输入:s = "babad"
输出:"bab"
解释:"aba" 同样是符合题意的答案。
示例 2:
输入:s = "cbbd"
输出:"bb"
提示:
1 <= s.length <= 1000
s 仅由数字和英文字母组成
解题思路:动态规划
*/
#include <bits/stdc++.h>
const int maxSize = 1000;
std::string longestPalindrome(std::string s)
{
int strSize = s.size();
int maxLen = 1;
int start = 0;
bool dp[maxSize][maxSize] = {false};
if (strSize < 2)
{
return s;
}
if (strSize == 2 && s[0] == s[1])
{
return s;
}
if (strSize == 2 && s[0] != s[1])
{
std::string tmp = {s[1]};
return tmp;
}
for (int i = 0; i < strSize; ++i)
{
dp[i][i] = true;
maxLen = 1;
start = i;
}
for (int i = 0; i < strSize; ++i)
{
if ((i + 1 < strSize) && s[i] == s[i + 1])
{
dp[i][i + 1] = true;
maxLen = 2;
start = i;
}
}
for (int i = 3; i < strSize + 1; ++i)
{
for (int j = 0; j < strSize - i + 1; ++j)
{
int tail = j + i - 1;
if (dp[j + 1][tail - 1] && s[j] == s[tail])
{
dp[j][tail] = true;
maxLen = i;
start = j;
}
}
}
return s.substr(start, maxLen);
}
int main()
{
std::string testStr = "cccsyyscc";
std::string sub = longestPalindrome(testStr);
std::cout << sub << std::endl;
return 0;
}