Python程序:查找字符串中的回文边界
假设我们得到一个字符串str。字符串的边界是指一个子字符串,它是该字符串的真前缀和后缀。例如,“ab”是字符串“ababab”的边界。如果边界字符串是回文,则称该边界为回文边界。现在假设给定字符串str中存在f(str)个回文边界。我们需要找到所有str的非空子字符串str_k的f(str_k)之和。该和可能很大,因此可以对10^9 + 7进行取模运算。
因此,如果输入类似于str = 'pqpqp',则输出将为5。字符串'pqpqp'存在15个子字符串;但是只有4个子字符串具有回文边界。这些字符串是
pqp : f(pqp) = 1 pqpqp : f(pqpqp) = 2 qpq : f(qpq) = 1 pqp : f(pqp) = 1 The sum of these values are 1 + 2 + 1 + 1 = 5.
为了解决这个问题,我们将遵循以下步骤:
- 定义一个函数palindrome_calculator()。它将接收input_dict作为输入。
- ans := 0
- 对于input_dict值的每个item1、item2,执行以下操作:
- ans := ans + item2 *(item2 - 1) / 2 的向下取整值
- 返回ans
- 定义一个函数str_check()。它将接收字符串作为输入。
- t_str := 字符串[0]
- 对于字符串中的每个s,执行以下操作:
- 如果s与t_str不同,则
- 返回False
- 返回True
- 如果s与t_str不同,则
- 定义一个函数string_res()。它将接收字符串作为输入。
- ans := 0
- 对于从2到字符串大小+1的每个i,执行以下操作:
- ans := ans + i *(i - 1) / 2 的向下取整值
- ans := ans mod 1000000007
- 返回and
- 如果str_check(string)为True,则
- 返回string_res(string)
- ans := 0
- odd_list := 一个包含一个新列表、一个新映射和1的新列表
- 对于字符串中的每个s,执行以下操作:
- 如果s不在odd_list[1]中,则
- odd_list[1, s] := 0
- odd_list[1, s] := odd_list[1, s] + 1
- 如果s不在odd_list[1]中,则
- 对于从0到字符串大小的每个i,执行以下操作:
- 将i插入odd_list[0]的末尾
- ans := ans + palindrome_calculator(odd_list[1])
- even_list := 一个包含一个新列表、一个新映射和1的新列表
- 对于从0到字符串大小-1的每个i,执行以下操作:
- 如果string[i]与string[i + 1]相同,则
- 将i插入even_list[0]的末尾
- tmp := 从索引i到i + 2的字符串
- 如果tmp不在even_list[1]中,则
- even_list[1, tmp] := 0
- even_list[1, tmp] := even_list[1, tmp] + 1
- 如果string[i]与string[i + 1]相同,则
- ans := ans + palindrome_calculator(even_list[1])
- 对于从3到字符串大小的每个val,执行以下操作:
- 如果val mod 2与0相同,则
- wt := even_list
- 否则,
- wt := odd_list
- new_t := 一个包含一个新列表、一个新映射和val的新列表
- 对于wt[0]中的每个索引,执行以下操作:
- 如果index - 1 >= 0且index + val - 2 < 字符串大小且string[index - 1]与string[index + val - 2]相同,则
- 将index - 1插入new_t[0]的末尾
- tmp := 从索引index - 1到index - 1 + val的字符串
- 如果tmp不在new_t[1]中,则
- new_t[1, tmp] := 0
- new_t[1, tmp] := new_t[1, tmp] + 1
- 如果index - 1 >= 0且index + val - 2 < 字符串大小且string[index - 1]与string[index + val - 2]相同,则
- ans := ans + palindrome_calculator(new_t[1])
- ans := ans mod 1000000007
- 如果val mod 2与0相同,则
- even_list := new_t
- 否则,
- odd_list := new_t
- 如果val mod 2与0相同,则
- 返回ans
示例
让我们看看以下实现以更好地理解
def palindrome_calculator(input_dict): ans = 0 for item1, item2 in input_dict.items(): ans += item2 * (item2 - 1) // 2 return ans def str_check(string): t_str = string[0] for s in string: if s != t_str: return False return True def string_res(string): ans = 0 for i in range(2, len(string) + 1): ans += i * (i - 1) // 2 ans %= 1000000007 return ans def solve(string): if str_check(string): return string_res(string) ans = 0 odd_list = [[], {}, 1] for s in string: if s not in odd_list[1]: odd_list[1][s] = 0 odd_list[1][s] += 1 for i in range(len(string)): odd_list[0].append(i) ans += palindrome_calculator(odd_list[1]) even_list = [[], {}, 1] for i in range(len(string) - 1): if string[i] == string[i + 1]: even_list[0].append(i) tmp = string[i:i + 2] if tmp not in even_list[1]: even_list[1][tmp] = 0 even_list[1][tmp] += 1 ans += palindrome_calculator(even_list[1]) for val in range(3, len(string)): if val % 2 == 0: wt = even_list else: wt = odd_list new_t = [[], {}, val] for index in wt[0]: if index - 1 >= 0 and index + val - 2 < len(string) and string[index - 1] == string[index + val - 2]: new_t[0].append(index - 1) tmp = string[index - 1 : index - 1 + val] if tmp not in new_t[1]: new_t[1][tmp] = 0 new_t[1][tmp] += 1 ans += palindrome_calculator(new_t[1]) ans %= 1000000007 if val % 2 == 0: even_list = new_t else: odd_list = new_t return ans print(solve('pqpqp'))
输入
'pqpqp'
输出
5
广告