返回
Manachar算法(马拉车算法):高效寻获最长回文子串
后端
2023-10-21 11:44:54
1. 算法原理
Manachar算法的核心思想是利用回文串的性质来简化匹配过程。回文串的特点是它从两边读是一样的,这种特性可以帮助我们大大缩减搜索范围。
举个例子,我们以字符串“aba”为例:
- 对于位置1处的字符"a",它的左、右字符都是"a",因此最长回文串的长度为3。
- 对于位置2处的字符"b",它的左、右字符分别为"a"和"a",由于"a"和"b"不同,因此以"b"为中心的最大回文串的长度为1。
通过这种思路,我们可以依次检查字符串中的每一个字符,并利用回文串的性质,在已经知道前一个位置的回文串长度的基础上,快速计算当前位置的回文串长度。
2. 实现步骤
-
预处理:
- 在字符串的开头和末尾添加特殊字符“$”和“#”,以确保字符串的两端都有一个分隔符。
- 新建一个与字符串长度相同的数组P,用于存储每个字符的回文半径。
-
遍历字符串:
- 使用两个指针i和j,其中i是当前位置,j是中心位置。
- 计算以i为中心的最长回文半径r。
- 如果i+r<=j+P[j],则P[i] = P[j]-(j-i)。
- 如果i+r>j+P[j],则计算i+r右边的回文半径,即P[i] = r。
- 更新中心位置j和最长回文半径r。
-
获取最长回文串:
- 遍历P数组,找出回文半径最大的位置,该位置对应的字符串即为最长回文串。
3. 实例
给定字符串“abaab”,以下是Manachar算法的实现步骤:
-
预处理:
- 添加特殊字符:"#a#b#a#a#b#"
- 初始化P数组:[0, 0, 1, 0, 3, 0, 1, 0, 3, 0, 0]
-
遍历字符串:
- i=1,j=2,r=1,P[1]=1
- i=2,j=2,r=1,P[2]=1
- i=3,j=4,r=3,P[3]=3
- i=4,j=4,r=1,P[4]=1
- i=5,j=6,r=3,P[5]=3
- i=6,j=6,r=1,P[6]=1
- i=7,j=8,r=3,P[7]=3
- i=8,j=8,r=1,P[8]=1
- i=9,j=10,r=3,P[9]=3
- i=10,j=10,r=1,P[10]=1
-
获取最长回文串:
- 最长回文半径为3,位于位置5,对应的字符串为“aba”。
4. 算法优势和应用场景
Manachar算法的优势在于时间复杂度低,平均时间复杂度为O(n),其中n为字符串的长度。相较于传统的中心扩散法,该算法在处理较长字符串时具有显著优势。
Manachar算法广泛应用于字符串匹配和处理领域,如文本搜索、数据压缩、密码学等。它在生物信息学中也发挥着重要作用,如DNA序列分析和基因组测序。
5. 总结
Manachar算法作为一种高效的字符串匹配算法,以其低时间复杂度和广泛的应用场景而备受重视。它不仅为字符串处理提供了强大的工具,也为研究人员和开发者们打开了一个广阔的探索空间。