मान लीजिए हमारे पास एक लोअरकेस अल्फाबेट स्ट्रिंग 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 :=एक ग्राफ की एडजेंसी सूची जहां डुप्लिकेट तत्व नहीं होंगे:pairsमें प्रत्येकx, yके लिए, करें:xकोg[x]के अंत में डालेंyकोg[y]के अंत में डालेंyकोg[x]के अंत में डालेंxकोg[y]के अंत में डालें
dfs()फ़ंक्शन परिभाषित करें। यहa, so_farलेगा:aकोso_farमें डालेंg[a]में प्रत्येकelemके लिए, करें:- यदि
elemso_farमें नहीं है, तो:dfs(elem, so_far)
- यदि
- मुख्य विधि से, निम्नलिखित करें:
gमें प्रत्येक कुंजी के लिए, करें:dfs(key, G[key])
iके लिए 0 सेfloor(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