Manacher's Algorithm,俗称马拉车算法,是一种用于查找一个字符串中最长回文子串的线性时间复杂度算法,由Manacher在1975年发明。该算法的主要贡献在于将查找最长回文子串的时间复杂度降低到了O(n)。以下是马拉车算法的操作步骤及原理:
操作步骤
- 预处理字符串:
- 在原字符串的每个字符之间以及首尾插入一个特殊的分隔符(如'#'),这样做的目的是将原字符串中的回文子串长度统一为奇数,方便后续处理。
- 为了防止越界,通常在字符串的开头和结尾再加上两个不同的字符(如'$'和'!'),但在实际操作中,由于字符串末尾默认有'\0'作为结束符,所以结尾的字符可以省略。
- 例如,原字符串"abcbaade"经过处理后变为"^#a#b#c#b#a#a#d#e#"。
- 初始化数组:
- 创建一个数组P,用于存储每个位置为中心的最长回文子串的半径(即最长回文子串的最右端字符到该中心的距离)。数组P的长度与处理后的字符串长度相同。
- 计算数组P:
- 遍历处理后的字符串,从左到右计算数组P的值。
- 对于每个位置i,如果它已经在之前找到的最长回文子串的范围内(即i <= R,其中R是之前找到的最长回文子串的最右端位置),则可以利用回文串的对称性来加速计算。
- 如果i不在之前找到的最长回文子串的范围内,则需要从i开始逐一匹配字符,