एक स्ट्रिंग तो टी लंबाई की कश्मीर दिखाई देता है कश्मीर एक स्ट्रिंग में या अधिक बार एस , तो यह है संभावित साम्यवादी । उदाहरण के लिए, 10में 10/10संभावित साम्यवादी है, ऐसा लगता है के लिए 2 बार और लंबाई की है 2 । ध्यान दें कि ये सबस्ट्रिंग ओवरलैप नहीं हो सकते हैं।
एक साम्यवादी परिवर्तन एक है कि इस स्ट्रिंग लेता है टी और प्रत्येक चरित्र चाल टी मैं की टी करने के लिए मैं की घटना टी में एस । इसलिए, पिछले उदाहरण के लिए, साम्यवादी परिवर्तन उपज देगा 1/0; पहली बार की 10जगह 10पहली बार 10मिला, और 0दूसरी बार।
एक साम्यवादी सामान्य एक समारोह है कि ऐसे सभी तार लेता है टी के साथ कश्मीर ≥ 2 और प्रदर्शन एक साम्यवादी परिवर्तन उन पर।
एल्गोरिथ्म पर कुछ विवरण:
- सबसे लंबे समय तक वैध तार पर साम्यवादी परिवर्तनों प्रदर्शन टी पहले । टी की पहली घटनाओं को अनुकूल करें ।
- फिर, अगले-सबसे लंबे समय तक तार पर साम्यवादी परिवर्तन करें, फिर अगला-अगला-सबसे लंबा ... आदि।
- तब तक दोहराएं जब तक कि स्ट्रिंग में इस तरह के तार मौजूद न हों।
ध्यान दें कि परीक्षण के मामलों में कुछ तार, जैसे "हेलो, हैलो" उदाहरण से दो अलग-अलग तरीकों से व्याख्या की जा सकती है। आप टी केell लिए उपयोग कर सकते हैं , लेकिन आप भी उपयोग कर सकते हैं । इस स्थिति में, आपका कोड या तो विकल्प चुन सकता है। दिखाया गया परीक्षण केस उपयोग करता है , लेकिन आपको एक अलग और समान रूप से मान्य आउटपुट मिल सकता है। llollo
आपका काम साम्यवादी सामान्यीकरण को लागू करना है। इनपुट में केवल मुद्रण योग्य ASCII वर्ण (0x20 से 0x7E, टिल्ड के लिए स्थान) शामिल होंगे। आप इस कार्य को हल करने के लिए एक कार्यक्रम या कार्य लिख सकते हैं; इनपुट को STDIN, स्ट्रिंग / चरित्र सरणी तर्क, ARGV से तर्क, आदि से एक पंक्ति के रूप में लिया जा सकता है।
परीक्षण के मामलों
'123' -> '123'
'111' -> '111'
'1111' -> '11'
'ABAB' -> 'AB'
'111111111' -> '111'
'asdasdasd' -> 'asd'
'10/10' -> '1/0'
'100/100+100' -> '1/0+0'
' + + ' -> ' + '
'Hello, hello, dear fellow!' -> 'Hel he, dear feow!' OR 'Heo hl, dear flow!'
'11122333/11122333/11122333' -> '112/13' OR '132/23'
'ababab1ababab' -> 'a1bab'
'1ab2ab3ab4ab5ab6' -> '1a2b3a4b5ab6'
टेस्ट केस का काम किया
प्रारूप 'string', 'substring'प्रतिस्थापन के प्रत्येक चरण पर है। प्रतिस्थापित बिट्स ब्रैकेटेड हैं।
'11[122]333/11[122]333/11[122]333', '122'
'111[333]/112[333]/112[333]', '333'
'1113/11[23]/11[23]', '23'
'11[13]/112/1[13]', '13'
'1[11]/[11]2/13', '11'
'1[/1]12[/1]3', '/1'
'112/13', ''
एक और परीक्षण मामला:
'Hello, hello, dear fellow!', 'llo'
'Hel, hel, dear feow!', 'l,'
'Hel he, dear feow!', ''
संदर्भ कोड (पायथन)
एल्गोरिदम की कल्पना करने के लिए आपको यह उपयोगी लग सकता है।
#!/usr/bin/env python
import re
def repeater(string):
def repeating_substring(substring):
return (string.count(substring) == len(substring)) and string.count(substring) > 1
return repeating_substring
def get_substrings(string):
j = 1
a = set()
while True:
for i in range(len(string) - j+1):
a.add(string[i:i+j])
if j == len(string):
break
j += 1
return list(a)
def replace_each_instance(string, substring):
assert `string`+',', `substring`
for i in substring:
string = re.sub(re.escape(substring), i, string, 1)
return string
def main(s):
repeats = repeater(s)
repeating_substr = filter(repeater(s), get_substrings(s))
while repeating_substr:
repeating_substr.sort(lambda x,y: cmp(len(y), len(x)))
s = replace_each_instance(s, repeating_substr[0])
repeating_substr = filter(repeater(s), get_substrings(s))
return s
assert main('123') == '123'
assert main('111') == '111'
assert main('1111') == '11'
assert main('ABAB') == 'AB'
assert main('111111111') == '111'
assert main('asdasdasd') == 'asd'
assert main('10/10') == '1/0'
assert main('100/100+100') == '1/0+0'
assert main(' + + ') == ' + '
assert main('Hello, hello, dear fellow!') == 'Hel he, dear feow!'
assert main('11122333/11122333/11122333') == '112/13'
इस चुनौती के मूल विचार को पोस्ट करने के लिए @ ConorO'Brien को धन्यवाद।
abदोनों तारों में कम से कम दो बार होता है।
ababab1ababab,1ab2ab3ab4ab5ab6