什么是马拉车算法?
马拉车算法是一种高效查找一个字符串的最长回文子串的线性时间复杂度算法。它通过巧妙的预处理和动态规划,避免了大量的重复计算,使得算法的效率得到了极大的提升。
注:回文(Palindrome)是指正读和反读都一样的字符串,即左右对称的字符串,如:level,noon,232…
算法核心思想
- 预处理:
- 在字符串的每个字符之间插入一个特殊字符(如#),使得原字符串变为奇数长度。这样,无论是奇数长度还是偶数长度的回文子串,都可以统一处理成奇数长度的回文子串。
- 中心扩展:
- 从字符串的第一个字符开始,向两边扩展,找到以当前字符为中心的回文子串的最长长度。
- 利用对称性:
- 算法的关键在于利用已经计算过的回文子串的信息,来加速后续回文子串的查找。通过对称性,可以减少不必要的字符比较。
算法实现步骤
- 预处理: 将原字符串转换为一个新的字符串,在每个字符之间插入一个特殊字符。
- 初始化数组P: 数组P用来存储以每个字符为中心的最长回文子串的半径。
- 遍历预处理后的字符串:
- 维护一个中心id和最右边界mx。
- 对于当前字符i,利用对称性,可以快速得到一个初始的回文半径。
- 然后,以i为中心,向两边扩展,直到遇到不匹配的字符或者到达边界。
- 更新P[i],以及中心id和最右边界mx。
代码示例(php)
1 | function longestPalindrome($s) { |
算法复杂度
马拉车算法的时间复杂度为O(n),空间复杂度也为O(n)。
算法优点
- 线性时间复杂度: 效率极高。
- 实现相对简单: 核心思想清晰易懂。
- 应用广泛: 在字符串处理、生物信息学等领域有广泛应用。
总结
马拉车算法是一种非常优秀的算法,它通过巧妙的预处理和利用对称性,实现了线性时间复杂度查找最长回文子串。在实际应用中,马拉车算法具有很高的效率和实用性。