길이 K 의 문자열 T 가 문자열 S 에서 K 이상으로 나타날 경우 잠재적으로 통신 가능 합니다. 예를 들어, in 은 잠재적으로 친숙합니다. 2 번 나타나고 길이가 2 이기 때문입니다 . 이 하위 문자열은 겹칠 수 없습니다.1010/10
공산주의 변환 문자열 얻어 하나 T를 , 각 캐릭터를 이동 t를 I 의 T 받는 I 의 발생 T 에서 S . 따라서, 이전 예를 들면, 공산주의 변환은 얻을 것이다 1/0; 의 첫 번째 문자 10을 대체 10처음으로 10발견하고, 0두 번째 시간입니다.
공산주의 정규화는 그러한 모든 문자열 취하는 함수이다 T 와 K ≥ 2가 행하는 공산주의 변환 그들.
알고리즘에 대한 일부 세부 사항 :
- 가장 긴 유효한 문자열 T에서 먼저 변환 변환을 수행하십시오 . T 의 첫 항목을 선호하십시오 .
- 그런 다음 가장 긴 문자열에서 다음으로 가장 긴 문자열 등에서 공산주의 적 변환을 수행하십시오.
- 해당 문자열이 문자열에 없을 때까지 반복하십시오.
테스트 사례에서 "Hello, Hello"예제와 같은 일부 문자열은 두 가지 다른 방식으로 해석 될 수 있습니다. 당신은 사용할 수 있습니다 ell에 대한 T ,하지만 당신은 또한 사용할 수 있습니다 llo. 이 경우 코드에서 옵션을 선택할 수 있습니다. 표시된 테스트 사례는을 사용 llo하지만 다른 동일한 결과를 얻을 수 있습니다.
당신의 임무는 공산주의 정상화를 구현하는 것입니다. 입력은 인쇄 가능한 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!', ''
참조 코드 (Python)
알고리즘을 시각화하는 데 유용 할 수 있습니다.
#!/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