📜  三个非重叠子串的计数,它们在连接时形成回文(1)

📅  最后修改于: 2023-12-03 15:21:26.987000             🧑  作者: Mango

三个非重叠子串的计数,它们在连接时形成回文

本题要求找出一个字符串中满足以下条件的三个非重叠子串,使得这三个子串连接起来形成一个回文字符串:

  1. 这三个子串不重叠
  2. 这三个子串的长度相同且大于等于 1
思路

首先,我们需要找到所有可能的三个非重叠子串。

对于一个长度为 n 的字符串,将其分为三份,可以形成 $n \times (n-1) \times (n-2) / 6$ 个三元组,时间复杂度为 $O(n^3)$。假设每个子串长度为 k,则需要检查每个三元组是否符合条件,时间复杂度为 $O(k)$。

对于任意一个三元组,其三个子串连接形成的新字符串长度为 3k,如果该字符串是回文的,则该三元组符合要求。判断一个字符串是否为回文可以采用双指针法,时间复杂度为 $O(k)$。

综上所述,时间复杂度为 $O(n^3 k)$。

代码
def count_palindromic_triples(s: str) -> int:
    n = len(s)
    res = 0
    for i in range(n):
        for j in range(i + 1, n):
            for k in range(j + 1, n):
                if (j - i) == (k - j) and (j - i + 1) % 2 == 1:
                    # 判断三个子串长度相等且为奇数
                    sub1, sub2, sub3 = s[i:j], s[j:k], s[k:]
                    if sub1 == sub3[::-1] and sub1 == sub2:
                        # 判断三个子串构成的字符串是否为回文
                        res += 1
    return res

返回的是一个整数,表示符合要求的三元组的个数。