AcWing139 哈希+二分+延伸字符串

该博客主要介绍了如何利用哈希和二分法解决AcWing139题目的回文子串最大长度问题。通过延伸字符串避免了奇偶性讨论,通过二分查找有效地找到了最大回文子串的半径。同时,解释了二分查找的边界处理和哈希前缀和的计算方法。
摘要由CSDN通过智能技术生成

目录

思考

AC代码

二分模板

补充


 题目引入:139. 回文子串的最大长度 - AcWing题库

思考

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.现在我们已经知道怎么判断一个字串是不是回文串了,那么我们如何找出那个最大字串呢?

这里应该考虑

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值