【字符串算法】马拉车算法

参考博客:https://blog.youkuaiyun.com/dyx404514/article/details/42061017

作用

时间复杂度 O ( n ) O(n) O(n)
可以求出一个串中最长回文子串长度,回文子串个数,每个位置的最长回文子串长度。

基本变量

char str[] : 输入的字符串。
char tmp[] : 预处理过后的字符串。
int mx : 当前最长回文子串匹配的最右位置。
int po : 当前最长回文子串的中点位置。
int Len[i]: 最长回文子串最右端离i的距离。
Len[i]-1: 该回文串在原字符串中的长度。
(Len[i]-i)/2:该回文串在原字符中的起始位置。

步骤

  1. 预处理:开头和末尾加一个特殊字符防止越界,将原字符串每个字符之间都插入#
  2. 计算Len[] 。 如果 i < mx,j为i相对于po的对称位置,且Len[j] <= mx-i。那么Len[i] = Len[j],否则i就需要重新匹配。

自己的体会

经过预处理之后,便只有奇数的回文子串,字符串中的#其实就代表最长回文子串为偶数的情况,例如只考虑回文长度为4的aaaa,处理过后变成aa#aa,这里的#其实就代表着aaaa这个回文子串。而正常的字符代表的是为奇数长度的回文子串。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值