0005 最长回文子串
题目链接:https://leetcode-cn.com/problems/longest-palindromic-substring/
给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。
示例 1:
输入: “babad”
输出: “bab”
注意: “aba” 也是一个有效答案。
示例 2:
输入: “cbbd”
输出: “bb”
解法一:暴力破解
int isPalindrome(char * str1, char * str2)
{
int len = str2 - str1 + 1;
if (len == 0) return 0;
int i;
for (i = 0; i < len / 2; i++)
{
if (str1[i] != str2[-i]) return 0;
}
return 1;
}
char* longestPalindrome(char* s) {
int len = strlen(s);
if (len == 1) return s;
if (isPalindrome(s, s + len - 1))
{
return s;
}
int max = 1;
int maxi = 0, maxj = 0;
for (int i = 0; i < len; i++)
{
for (int j = i + 1; j < len; j++)
{
if (isPalindrome(s + i, s + j))
{
if (j - i + 1 > max)
{
max = j -i +1;
maxi = i;
maxj = j;
}
}
}
}
char * str = (char *)malloc(sizeof(char) * (max + 1));
for (int m = maxi; m <= maxj; m++)
{
str[m - maxi] = s[m];
}
str[max] = '\0';
return str;
}
解法二:动态规划
1.C语言版
char* longestPalindrome(char* s) {
int len = strlen(s);
// max 最大的回文串长度, maxi max串起始索引, maxj max串结束索引
int max = 0, maxi = 0, maxj = 0;
// dp[i][j]表示从s的i位置到j位置是否是回文串
int (*dp)[len] = calloc(sizeof(int), len * len);
// dp[i][i] 单个字符都是回文串
for (int i = 0; i < len; i++)
{
dp[i][i] = 1;
// 将dp[i+1][i]设为1,方便用公式计算相邻字符是否回文串
if (i < len - 1) dp[i + 1][i] = 1;
}
// 开始计算2~len个字母是否回文
int num = 1, j;
while (num < len) {
// 对角线计算
for (int i = 0; i + num < len; i++)
{
j = i + num;
dp[i][j] = dp[i + 1][j - 1] && s[i] == s[j];
if (dp[i][j])
{
if (max < num)
{
max = num;
maxi = i;
maxj = i + num;
}
}
}
num++;
}
char *ans = calloc((maxj - maxi + 2), sizeof(char));
memcpy(ans, s + maxi, maxj - maxi + 1);
return ans;
}
2.Java版
public String longestPalindrome(String s) {
int len = s.length();
if (len == 0) return "";
int max = 0, maxi = 0, maxj = 0;
boolean [][]dp = new boolean[len][len];
for (int i = 0; i < len; i++) {
dp[i][i] = true;
if (i < len - 1) dp[i + 1][i] = true;
}
int num = 1, j;
while (num < len) {
for (int i = 0; i + num < len; i++) {
j = i + num;
dp[i][j] = dp[i+1][j - 1] && s.charAt(i) == s.charAt(j);
if (dp[i][j]) {
if (max < num) {
max = num;
maxi = i;
maxj = i + num;
}
}
}
num++;
}
return s.substring(maxi, maxj + 1);
}