Python程式檢查字串是否為迴文(包含等價對)
假設我們有一個名為s的小寫字母字串,還有一個名為'pairs'的配對列表。pairs中的每個元素都包含兩個字串[a, b],其中字元'a'和'b'被認為是相同的。如果存在兩個對,例如[a, b]和[b, c],那麼我們可以說a和b是等價的,b和c也是等價的,所以a和c也是等價的。任何值a或b都與其自身等價。我們必須檢查s是否為迴文,並考慮給定的等價關係。
因此,如果輸入類似於s = "raceckt" pairs = [["r", "t"], ["a", "k"], ["z", "x"]],則輸出將為True,因為"a" = "k","r" = "t",所以字串可以是"racecar",這是一個迴文。
為了解決這個問題,我們將遵循以下步驟:
- g := 圖的鄰接表,其中列表可能包含重複元素
- G := 圖的鄰接表,其中不包含重複元素
- 對於每個x, y in pairs,執行:
- 將x插入到g[x]的末尾
- 將y插入到g[y]的末尾
- 將y插入到g[x]的末尾
- 將x插入到g[y]的末尾
- 定義一個函式dfs()。這將接收a, so_far
- 將a插入到so_far
- 對於g[a]中的每個元素,執行:
- 如果元素不在so_far中,則
- dfs(elem, so_far)
- 如果元素不在so_far中,則
- 從主方法中,執行以下操作:
- 對於g中的每個鍵,執行:
- dfs(key, G[key])
- 對於i in range 0 到 floor(s的長度 / 2),執行:
- 如果s[i]與s[s的長度 -1-i]相同,或者(s[i]在G[s[s的長度 - 1-i]]中或s[-1 - i]在G[s[i]]中),則
- 進入下一個迭代
- 否則,
- 返回False
- 如果s[i]與s[s的長度 -1-i]相同,或者(s[i]在G[s[s的長度 - 1-i]]中或s[-1 - i]在G[s[i]]中),則
- 返回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
廣告