मान लीजिए हमारे पास एक स्ट्रिंग S है। लंबाई n है। ये n बॉक्स एक-दूसरे से सटे हुए हैं, पोजीशन i पर कैरेक्टर R दर्शाता है कि i-th बॉक्स को दाईं ओर धकेला जा रहा है। इसी तरह, पोजीशन i पर L दर्शाता है कि i-th बॉक्स को बाईं ओर धकेला जा रहा है, एक डॉट '.' एक खाली स्थान दर्शाता है। प्रारंभिक कॉन्फिगरेशन से शुरू करके, हर टाइम यूनिट पर, दाईं ओर धकेला जा रहा बॉक्स अगले बॉक्स को दाईं ओर धकेलने में सक्षम होता है, वही क्रिया बाईं ओर के लिए भी लागू होती है। हमें सभी बॉक्स की अंतिम स्थितियां ढूंढनी हैं जब कोई और मूवमेंट संभव न हो।
तो, यदि इनपुट 'R..R...L.' जैसा है, तो आउटपुट 'RRRRR.LL.' होगा।
इसे हल करने के लिए, हम इन चरणों का पालन करेंगे:
- N := स्ट्रिंग का आकार
- movement := आकार N की ऐरे, 0 से भरी
- m := 0
- i को 0 से N तक रेंज में, करें
- यदि string[i] == 'R', तो
- m := N
- अन्यथा जब string[i] == 'L', तो
- m := 0
- अन्यथा,
- m := max(m - 1, 0)
- movement[i] := movement[i] + m
- यदि string[i] == 'R', तो
- m := 0
- i को N - 1 से -1 तक, 1 से घटाते हुए, करें
- यदि string[i] == 'L', तो
- m := N
- अन्यथा जब string[i] == 'R', तो
- m := 0
- अन्यथा,
- m := max(m - 1, 0)
- movement[i] := movement[i] - m
- यदि string[i] == 'L', तो
- movement में प्रत्येक एलिमेंट m के लिए डॉट जोड़ें यदि m 0 है, अन्यथा 'R' यदि m > 0, अन्यथा 'L' जोड़कर एक स्ट्रिंग बनाकर लौटाएं।
उदाहरण कोड
बेहतर समझ के लिए निम्नलिखित इम्प्लीमेंटेशन देखें:
def get_final_pos(string):
N = len(string)
movement = [0] * N
m = 0
for i in range(N):
if string[i] == 'R':
m = N
elif string[i] == 'L':
m = 0
else:
m = max(m - 1, 0)
movement[i] += m
m = 0
for i in range(N - 1, -1, -1):
if string[i] == 'L':
m = N
elif string[i] == 'R':
m = 0
else:
m = max(m - 1, 0)
movement[i] -= m
return "".join('.' if m == 0 else 'R' if m > 0 else 'L' for m in movement)
print(get_final_pos('R..R...L.'))
इनपुट
'R..R...L.'
आउटपुट
RRRRR.LL.