สมมติว่าเรามีสตริงพิมพ์เล็กชื่อ s และรายการคู่ชื่อ pairs แต่ละสมาชิกใน pairs มีสองสตริง [a, b] โดยตัวอักษร a และ b ถือว่าเหมือนกัน หากมีคู่ [a, b] และ [b, c] แล้ว a และ b เทียบเท่า b และ c เทียบเท่า ดังนั้น a และ c ก็เทียบเท่า และค่าใดๆ ก็เทียบเท่ากับตัวมันเอง เราต้องตรวจสอบว่า s เป็นพาลินโดรมหรือไม่ภายใต้ความสัมพันธ์เทียบเท่านี้
เช่น ถ้าอินพุตคือ s = "raceckt", pairs = [["r", "t"], ["a", "k"], ["z", "x"]] ผลลัพธ์จะเป็น True เพราะ "a" = "k" และ "r" = "t" สตริงจึงกลายเป็น "racecar" ซึ่งเป็นพาลินโดรม
ขั้นตอนการแก้ปัญหา
g := adjacency list ของกราฟที่อาจมีสมาชิกซ้ำG := adjacency list ของกราฟที่ไม่มีสมาชิกซ้ำ:- สำหรับแต่ละ
x, yในpairsเพิ่มxเข้าg[x],yเข้าg[y],yเข้าg[x],xเข้าg[y]
- สำหรับแต่ละ
- กำหนดฟังก์ชัน
dfs(a, so_far):- เพิ่ม
aเข้าso_far - สำหรับแต่ละ
elemในg[a]ถ้าelemไม่อยู่ในso_farเรียกdfs(elem, so_far)
- เพิ่ม
- จากเมธอดหลัก:
- สำหรับแต่ละ
keyในgเรียกdfs(key, G[key]) - สำหรับ
iในช่วง0ถึงfloor(ขนาดของ s / 2):- ถ้า
s[i] == s[-1-i]หรือ(s[i] ใน G[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