描述:
给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。
示例:
输入: "babad"
输出: "bab"
注意: "aba" 也是一个有效答案。
输入: "cbbd"
输出: "bb"
想法:
- 最简单的就是分两种情况,一种中心扩散的,那就向两边遍历,另一种就是中心是两个的,那就和大一个的一起向外扩散
- 马拉车算法 Manacher:也就是将两种情况合并,中心为两个的情况,就是0.5,但是索引不能为小数,所以相当于所有扩大两倍之后,就可以两种情况合并
static public string LongestPalindrome(string s)
{
int n = 0, index = 0;
int k;
for (int i = 0; i < s.Length; i++)
{
k = 0;
while (i - k >= 0 && i + k < s.Length && s[i - k] == s[i + k])
{
k++;
}
k--;
if (2 * k + 1 > n)
{
index = i - k;
n = 2 * k + 1;
}
}
for (int i = 0; i < s.Length; i++)
{
k = 0;
while (i - k >= 0 && i + k + 1 < s.Length && s[i - k] == s[i + k + 1])
{
k++;
}
k--;
if (2 * k + 2 > n)
{
index = i - k;
n = 2 * k + 2;
}
}
return s.Substring(index, n);
}
##具体参见官网原题解析