字符串化繁为简 python版

一、题目描述

给定一个输入字符串,字符串只可能由英文字母(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()

四、额外补充

如果是我的话,我应该直接放弃了。主要涉及的内容较多。还有这个代码我没有看懂。。。。

  • 9
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值