目录
思考
1.题目询问的是一个字符串当中长度最大的回文串,数据长度为十万,暴力枚举是肯定不行的
考虑用哈希算法完成,那么如何用哈希算法来证明一个字符串是回文串呢?
当然是利用哈希前缀和,我们知道回文串就是一个正着读和倒着读都一样的字符串,那么,我们可以构造两个哈希前缀和,分别是输入字符串的正序和倒序,通过判断字符串前半段的前缀和以及字符串后半段的前缀和是否相等,就能知道该字符串是不是回文串了
但是,如果要找出字符的前半段和后半段,就涉及到分类讨论的问题,因为回文串的长度可能是奇数,也可能是偶数,那么,有没有一种办法,不用分类讨论呢?这就用到了下面介绍的延伸字符串的操作
2.延伸字符串,就是在每两个字符之间添加一个元素,这样无论原来的回文串是奇数还是偶数,都只变成了奇数回文串,下面证明这种方法的有效性:
假设字符串长度为 n ,延展字符串后,因为每两个字符间要添加一个字符,所以一共添加了 n - 1 个字符,这样字符串总长度变为 2 * n - 1 ,恒为奇数
代码实现
string s;
int n = s.length();
for(int i = n * 2; i >= 0; i -= 2) //拉伸字符串,并在每两个字符之间添加一个字符
{
s[i] = s[i / 2];
s[i - 1] = 'z' + 1; //添加的字符为 'z'的下一位
}
假设原字符串为 abc,延伸后变为 {a{b{c,可能你会问,不是添加 n - 1 个字符吗,那为什么 a 的前面会多添加了一个字符,因为其实这并不影响哈希算法判断该字符串中的一个字串是不是回文串以及回文串的最大长度。
3.现在我们已经知道怎么判断一个字串是不是回文串了,那么我们如何找出那个最大字串呢?
这里应该考虑