मान लीजिए हमारे पास केवल तीन वर्णों 'A', 'B' और '#' वाली दो स्ट्रिंग्स s और t हैं। हमें यह जांचना है कि क्या s पर ये ऑपरेशन करके s को t में बदलना संभव है।
- 'A' केवल बाईं ओर जा सकता है
- 'B' केवल दाईं ओर जा सकता है
- न तो 'A' और न ही 'B' एक दूसरे को पार कर सकते हैं
तो, यदि इनपुट s = "##AB##B", t = "A###B#B" है, तो आउटपुट True होगा क्योंकि s में A आसानी से सबसे बाएं स्थान पर जा सकता है, और मध्य B एक कदम दाईं ओर जा सकता है।
हल करने के चरण
- s := s से वर्ण लेकर एक सूची
- t := t से वर्ण लेकर एक सूची
- यदि s का आकार t के आकार के समान नहीं है, तो:
- False लौटाएं
- यदि s और t में 'A' की संख्या अलग है या s और t में 'B' की संख्या अलग है, तो:
- False लौटाएं
- रेंज 0 से s के आकार - 1 तक के लिए i, करें:
- यदि s[i], '#' के समान नहीं है, तो:
- रेंज 0 से t के आकार - 1 तक के लिए j, करें:
- यदि (t[j], s[i] के समान नहीं है) और t[j], '#' के समान नहीं है, तो:
- False लौटाएं
- यदि t[j], s[i] के समान है, तो:
- t[j] := '#'
- यदि s[i], 'A' के समान है और i < j, तो:
- False लौटाएं
- यदि s[i], 'B' के समान है और i > j, तो:
- False लौटाएं
- लूप से बाहर आएं
- यदि (t[j], s[i] के समान नहीं है) और t[j], '#' के समान नहीं है, तो:
- रेंज 0 से t के आकार - 1 तक के लिए j, करें:
- यदि s[i], '#' के समान नहीं है, तो:
- True लौटाएं
उदाहरण
def solve(s, t):
s = list(s)
t = list(t)
if len(s) != len(t):
return False
if s.count('A') != t.count('A') or s.count('B') != t.count('B'):
return False
for i in range(len(s)):
if s[i] != '#':
for j in range(len(t)):
if (t[j] != s[i]) and t[j] != '#':
return False
if t[j] == s[i]:
t[j] = '#'
if s[i] == 'A' and i < j:
return False
if s[i] == 'B' and i > j:
return False
break
return True
s = "##AB##B"
t = "A###B#B"
print(solve(s, t))
इनपुट
"##AB##B", "A###B#B"
आउटपुट
True