使用 Python 中的等价对检查字符串是否为回文的程序

pythonserver side programmingprogramming更新于 2026/1/5 22:04:17

假设我们有一个名为 s 的小写字母字符串,还有一个名为"pairs"的对列表。pairs 中的每个元素都有两个字符串 [a, b],其中字符"a"和"b"被视为相同。如果有两对 [a, b] 和 [b, c],那么我们可以说 a 和 b 是等价的,b 和 c 也是等价的,所以 a 和 c 也是等价的。任何值 a 或 b 都等同于其自身。我们必须使用给定的等价关系检查 s 是否为回文。

因此,如果输入为 s = "raceckt"对 = [["r", "t"], ["a", "k"], ["z", "x"]],则输出将为 True,因为 "a" = "k",且 "r" = "t" 因此字符串可以是 "racecar"是回文。

为了解决这个问题,我们将遵循以下步骤 −

  • g := 图的邻接列表,其中列表可能包含重复元素
  • G := 图的邻接列表,其中不包含重复元素
    • 对于每个成对的 x、y,执行
    • 在 g[x] 的末尾插入 x
    • 在 g[y] 的末尾插入 y
    • 在 g[x] 的末尾插入 y
    • 在 g[y] 的末尾插入 x
  • 定义一个函数 dfs() 。这将需要 a,so_far
  • 将 a 插入 so_far
  • 对于 g[a] 中的每个元素,执行
    • 如果 elem 不在 so_far 中,则
      • dfs(elem, so_far)
  • 从主方法中,执行以下操作 −
  • 对于 g 中的每个键,执行
    • dfs(key, G[key])
    • 对于 i 在 0 到(s / 2 的大小)的范围内,执行
      • 如果 s[i] 与 s[s -1-i 的大小] 相同或(s[i] 在 G[s[s - 1-i 的大小]] 中或 s[-1 - i] 在G[s[i]]) ,则
        • 进行下一次迭代
      • 否则,
        • 返回 False
  • 返回 True

示例

让我们看看下面的实现以便更好地理解 −

from collections import defaultdict
def solve(s, pairs):
   g = defaultdict(list)
   G = defaultdict(set)
   for x, y in pairs:
      g[x].append(x)
      g[y].append(y)
      g[x].append(y)
      g[y].append(x)

   def dfs(a, so_far):
      so_far.add(a)
      for elem in g[a]:
         if elem not in so_far:
            dfs(elem, so_far)

   for key in g:
      dfs(key, G[key])

   for i in range(0, len(s) // 2):
      if s[i] == s[-1 - i] or (s[i] in G[s[-1 - i]] or s[-1 - i] in G[s[i]]):
         continue
      else:
         return False
   return True

s = "raceckt"
pairs = [["r", "t"], ["a", "k"], ["z", "x"]]
print(solve(s, pairs))

输入

"raceckt", [["r", "t"], ["a", "k"], ["z", "x"]]

输出

True

相关文章


有用资源