一、题目描述
给定一个输入字符串,字符串只可能由英文字母(a ~ z、A ~ Z)和左右小括号()组成。当字符里存在小括号时,小括号是成对的,可以有一个或多个小括号对,小括号对不会嵌套,小括号对内可以包含1个或多个英文字母也可以不包含英文字母。当小括号对内包含多个英文字母时,这些字母之间是相互等效的关系,而且等效关系可以在不同的小括号对之间传递,即当存在a和b等效和存在b和c等效时,a和c 也等效,另外,同一个英文字母的大写字和小写字母也相互等效(即使它们分布在不同的括号对里)。
要对这个输入字符串做简化,输出一个新的字符串,输出字符串里只需保留输入字符串里的没有被小括号对包含的字符(按照输入字符串里的字符顺序),并将每个字符替换为在小括号对里包含的字典序最小的等效字符。如果简化后的字符串为空,请输出为"0"
示例:输入字符串为"never(dont)live(run)up(f)()“,初始等效字符集合为(d,o,n,t,r,u,n),由于等效关系可以传递,因此最终等效字符集合为(d,n,o,r,t,u),将输入字符串里的剩余部分按字典序最小的等效字符替换后得到"devedlivedp”
输入描述
输入为1行,代表输入字符串
输入字符串的长度在1~100000之间
(abd)demand(fb)()for
输出描述
输出为1行,代表输出字符串
aemanaaor
二、解题思路
1.首先提取小括号内的字符放入set中去重,小括号内字符个数大于等于1时才放入set
2.将非小括号内的字符组成新的字符串
3.对set中的字符按照字典序排序,并转为字符数组
4.对新字符串遍历,当某个字符出现在字符数组中,将它替换为字符数组中第一个字母
5.输出替换好的字符串
三、详细代码
def parse_string(s):
isOpen = False # 是否有括号变量
main_chars = []
eq_chars = []
tmp = [] # 等价字母列表
# 遍历字符串,括号中检测和操作
for c in s:
# 每个括号内的字母先放在tmp列表,之后一个括号内的组成一个集合放在eq_chars列表中
if c == '(':
isOpen = True
continue
# 括号结束时将不为空的tmp列表变成一个集合,压入eq_chars列表中,同时把tmp置空
if c == ')':
isOpen = False
if tmp:
eq_chars.append(set(tmp))
tmp = []
continue
# 等价字符都放到tmp列表中
if isOpen:
tmp.append(c)
# 括号外的字母放到main_chars列表中
else:
main_chars.append(c)
return main_chars, eq_chars # 等价于 return (main_chars,eq_chars) 返回两者组成的元组
def merge_eq_chars(eq_chars):
i = 0
while i < len(eq_chars):
merged = False
for j in range(len(eq_chars)):
if i == j:
continue
if eq_chars[i] & eq_chars[j] or {char.lower() for char in eq_chars[i]} & {char.lower() for char in
eq_chars[j]}:
eq_chars[i] = eq_chars[i].union(eq_chars[j])
eq_chars.pop(j)
merged = True
break
if not merged:
i += 1
return eq_chars
def replace_main_chars(main_chars, eq_chars):
replace_dict = {}
for chars in eq_chars:
if chars:
min_char = min(chars, key=lambda x: (x.lower(), x))
for char in chars:
replace_dict[char] = min_char
replace_dict[char.lower()] = min_char
replace_dict[char.upper()] = min_char
result = ''.join([replace_dict.get(c, c) for c in main_chars])
return result if result else '0'
def main():
s = input()
main_chars, eq_chars = parse_string(s)
eq_chars = merge_eq_chars(eq_chars)
print(replace_main_chars(main_chars, eq_chars))
if __name__ == "__main__":
main()
四、额外补充
如果是我的话,我应该直接放弃了。主要涉及的内容较多。还有这个代码我没有看懂。。。。