考虑这样的一个最长回文子串问题:
- 给定一个长度为 n 的字符串
S - 现在要从中找出一个回文的子串 T
- 字符串
A 是回文的,当且仅当 A 反转后的A′ 和 A 完全相等。 - 问
T 可能的最大长度。
容易想到直观的暴力算法,枚举所有的子串并逐一判断,时间复杂度为 Θ(n3) 。
但可以注意到,回文串必然有一个“中心”,且整个串是关于这个中心左右对称的,因此一个长度大于2的回文串中必有一个更短的回文串,例如当 S1..5 是回文串时, S2..4 也一定是回文串。
抓住这一性质后我们就可以枚举回文串的中心,不断比较左边和右边的字符是否相等,时间复杂度为 Θ(n2) 。
这种做法挖掘出了一个非常重要的性质,并以此进行了优化。但是还可以做的更好!
如果我们充分利用回文字符串的性质(左右对称),还可以通过左边的对称中心的答案直接获得对称的右边的对称中心的答案。
不妨通过一个例子来详细说明。
i< |
---|