Jika string T dengan panjang K muncul K atau lebih banyak dalam string S , maka berpotensi komunis . Misalnya, 10
dalam 10/10
berpotensi komunis, karena muncul 2 kali dan panjangnya 2 . Perhatikan bahwa substring ini tidak dapat tumpang tindih.
Sebuah transformasi komunis adalah salah satu yang mengambil string ini T dan bergerak masing-masing karakter t i dari T ke saya terjadinya T di S . Jadi, untuk contoh sebelumnya, transformasi komunis akan menghasilkan 1/0
; char pertama 10
menggantikan 10
pertama kali 10
ditemukan, dan 0
kedua kalinya.
Sebuah normalisasi komunis adalah fungsi yang mengambil semua string seperti T dengan K ≥ 2 dan melakukan transformasi komunis pada mereka.
Beberapa spesifikasi algoritma:
- Lakukan transformasi komunistik pada string T terlama yang valid terlebih dahulu . Mendukung kejadian pertama T .
- Kemudian, lakukan transformasi komunistik pada string terpanjang berikutnya, kemudian selanjutnya-terpanjang ... dll
- Ulangi sampai tidak ada string seperti itu di string.
Perhatikan bahwa beberapa string, seperti contoh "Halo, Halo" dalam kasus uji, dapat diartikan dua cara berbeda. Anda dapat menggunakan ell
untuk T , tetapi Anda juga dapat menggunakan llo
. Dalam hal ini, kode Anda dapat memilih salah satu opsi. Kasing uji yang ditampilkan menggunakan llo
, tetapi Anda mungkin mendapatkan hasil yang berbeda dan sama-sama valid.
Tugas Anda adalah menerapkan normalisasi komunis. Input hanya akan terdiri dari karakter ASCII yang dapat dicetak (0x20 hingga 0x7E, space to tilde). Anda dapat menulis program atau fungsi untuk menyelesaikan tugas ini; input dapat diambil sebagai garis dari STDIN, argumen array karakter / string, argumen dari ARGV, dll.
Uji kasus
'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'
Mengerjakan test case
Formatnya adalah 'string', 'substring'
, pada setiap langkah penggantian. Bit yang diganti diberi tanda kurung.
'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', ''
Test case lain:
'Hello, hello, dear fellow!', 'llo'
'Hel, hel, dear feow!', 'l,'
'Hel he, dear feow!', ''
Kode referensi (Python)
Anda mungkin menemukan ini berguna untuk memvisualisasikan algoritma.
#!/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'
Terima kasih kepada @ ConorO'Brien karena memposting ide orisinil dari tantangan ini.
ab
terjadi setidaknya dua kali di kedua string.
ababab1ababab
,1ab2ab3ab4ab5ab6