問題描述:
給定一個輸入字符串,字符串只可能由英文字母('a'~'z'、'A'~'Z') 和左右小括號('('、')')組成。當字符串里存在小括號時,小括號是成對的,可以有一個或多個小括號對,小括號對不會嵌套,小括號對內可以包含1個或多個英文字母,也可以不包含英文字母。當小括號對內包含多個英文字母時,這些字母之間是相互等效的關系,而且等效關系可以在不同的小括號對之間傳遞,即當存在'a'和'b'等效和存在'b'和'c'等效時,'a'和'c'也等效,另外,同一個英文字母的大寫字母和小寫字母也相互等效(即使它們分布在不同的括號對里)
需要對這個輸入字符串做簡化,輸出一個新的字符串,
輸出字符串里只需保留輸入字符串里的沒有被小括號對包含的字符(按照輸入字符串里的字符順序),并將每個字符替換為在小括號對里包含的且字典序最小的等效字符。
如果簡化后的字符串為空,請輸出為"0"。
示例:
輸入字符串為"never(dont)give(run)up(f)()",初始等效字符集合為('d'. 'o'. 'n'. 't')、 ('r'. 'u','n'),由于等效關系可以傳遞,因此最終等效字符集合為('d', 'o', 'n', 't', 'r', 'u'),將輸入字符串里的剩余部分按字典序最小的等效字符替換后得到"devedgivedp"
輸入描述
input_string
輸入為1行,代表輸入字符串
輸出描述
output_string
輸出為1行,代表輸出字符串
補充說明
輸入字符串的長度在1~100000之間
()happy(xyz)new(wxy)year(t)
happwnewwear
#說明:等效字符集為('x’, 'y','z’,'w'),輸入字符串里沒有被小括號包含的子字符串集合為"happynewyear",將其中字符替換為字典序最小的等效字符后輸出為:"happwnewwear"
()abcdefgAC(a)(Ab)(C)
AAcdefgAC
#說明:等效字符集為('a', 'A', 'b'),輸入字符串里沒有被小括號包含的子字符串集合為"abcdefgAC",將其中字符替換為字典序最小的等效字符后輸出為:“AAcdefgAC"
解題思路:
根據規則:
- 小括號內多個英文字母,這幾個英文字母等效
- 多個小括號內英文字母的等效關系可以傳遞
- 同一個英文字母的大小寫等效
情況判斷:
進入小括號內部:
- 使用一個set()集合記錄等效字母集
- 多個英文字母:直接將這幾個英文字母加入集合
- 一個英文字母:先將這個英文字母加入另一個set()集合,待字符串處理完成時,判斷該字母對應的大(小)寫字母是否存在于第一個set()集合中,是則加入第一個set()。
或者在小括號外部:
- 使用一個list記錄不在小括號內的字母
- 將等效字母集排序,取第一個(或者set()為空,則是空)
- 遍歷list,若當前字母在set()中,將當前字母替換為最小等效字母
代碼實現:
s = list(input())
s1 = set()#記錄小括號內多個英文字母
s2 = set()#記錄小括號內單個英文字母
ans = []
i = 0
#處理字符串
while i < len(s):if s[i] == '(':#進入小括號內部i += 1right = iwhile s[right] != ')':right += 1if right-i > 1:#多個for i in range(i,right):s1.add(s[i])elif right-i == 1:#單個s2.add(s[i])i = right+1else:#小括號外部while i < len(s) and s[i] != '(':ans.append(s[i])i += 1 if i == len(s):break
#判斷s2中對應的字母大小寫是否在s1中
for x in list(s2):if 'a' <= x <= 'z' and x.upper() in s1:s1.add(x)elif 'A' <= x <= 'Z' and x.lower() in s1:s1.add(x)
k = ''#最小等效字母
s1 = sorted(s1)
if s1:k = s1[0]
for i in range(len(ans)):if ans[i] in s1:ans[i] = k#替換
print(''.join(ans))