给定字符串s,判断s[i..j]是否为回文(动态规划)

刷leetcode的时候看到的,判断 s 的子串 s[i…j] 是否为回文
整理一篇博客吧(●ˇ∀ˇ●)


当我们在判断 s[i…j] 是否为回文串时,常规的方法是使用双指针分别指向 i 和 j,每次判断两个指针指向的字符是否相同,直到两个指针相遇。然而这种方法会产生重复计算,例如下面这个例子:

当 s=aaba 时,对于前 2 个字符 aa,我们有 2 种分割方法 [aa] 和 [a,a],当我们每一次搜索到字符串的第 i=2 个字符 b 时,都需要对于每个 s[i…j] 使用双指针判断其是否为回文串,这就产生了重复计算。

因此,我们可以将字符串 s 的每个子串 s[i…j] 是否为回文串预处理出来,使用动态规划即可。设 f(i, j) 表示 s[i…j] 是否为回文串,那么有状态转移方程:

f ( i , j ) = { True , i ≥ j f ( i + 1 , j − 1 ) ∧ ( s [ i ] = s [ j ] ) , otherwise f(i, j) = \begin{cases} \texttt{True}, & \quad i \geq j \\ f(i+1,j-1) \wedge (s[i]=s[j]), & \quad \text{otherwise} \end{cases} f(i,j)={True,f(i+1,j1)(s[i]=s[j]),ijotherwise

其中 ∧ \wedge 表示逻辑与运算,即 s[i…j] 为回文串,当且仅当其为空串(i>j),其长度为 1(i=j),或者首尾字符相同且 s[i+1…j-1] 为回文串。

预处理完成之后,我们只需要 O(1) 的时间就可以判断任意 s[i…j] 是否为回文串了。

作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/palindrome-partitioning/solution/fen-ge-hui-wen-chuan-by-leetcode-solutio-6jkv/
来源:力扣(LeetCode) 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

你可能感兴趣的:(Algorithm,数据结构)