// 1. 暴力解法 // 时间复杂度 O(N^3)// 判断str[i...j]是否是回文串bool isPalindrome(constchar *str, int begin, int end)
{
while (begin <= end)
{
if (str[begin] == str[end])
{
begin++;
end--;
}
elsereturnfalse;
}
returntrue;
}
// 返回字符串str的最长回文子串的长度int longestPalindrome(constchar *str)
{
if (str == NULL)
return0;
int len = strlen(str);
if (len == 1)
return1;
int longest = 1;
for (int i = 0; i < len; i++)
for (int j = i + 1; j < len; j++)
if (isPalindrome(str, i, j) == true)
longest = max(j-i+1, longest);
return longest;
}
2. 中心扩展法
// 2. 中心展开法// 时间复杂度 O(N^2)// 以mid为中心轴的回文子串的长度int palindrome(constchar *str, int mid)
{
int left = mid - 1, right = mid + 1;
int len = strlen(str);
while (str[mid] == str[right])
right++;
while (left >= 0 && right < len && str[left] == str[right])
{
left--;
right++;
}
return right - left - 1;
}
int longestPalindrome01(constchar *str)
{
if (str == NULL)
return0;
int len = strlen(str);
if (len == 1)
return1;
int longest = 1;
for (int i = 0; i < len; i++)
{
int tmp = palindrome(str, i);
if (tmp > longest)
longest = tmp;
}
return longest;
}
3. 动态规划法
// 3. 动态规划法// 时间复杂度 O(N^2)int longestPalindrome02(constchar *str)
{
if (str == NULL) return0;
int len = strlen(str);
if (len == 1) return1;
int ans = 1; // 记录回文子串长度int dp[100][100]; // dp[i][j] 表示 str[i] 到 str[j] 是否为回文子串, 是为 1, 不是为 0for (int i = 0; i < len; i++)
{
dp[i][i] = 1;
if (str[i] == str[i + 1])
{
dp[i][i + 1] = 1;
ans = 2;
}
}
for (int i = 3; i < len; i++)
{
for (int j = 0; j + i - 1 < len; j++)
{
int k = j + i - 1;
if (str[k] == str[j] && dp[j+1][k-1] == 1)
{
dp[j][k] = 1;
ans = i;
}
}
}
return ans;
}