You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Python中利用查找表实现字符串的多组合替换?

问题:生成所有可能的缩写替换结果

现有代码仅能将字符串按单个单词拆分后替换为查找表中的缩写:

case = ["MY_FIRST_RODEO"]
lookup = {'MY': 'M', 'FIRST': 'FRST', 'RODEO' : 'RD', 'FIRST_RODEO': 'FRD', 'MY_FIRST': 'MF', 'MY_FIRST_RODEO': 'MFR'}
case_mod = []
for string in case:
    words = string.split("_")
    new_string = [lookup[word] for word in words]
    case_mod.append("_".join(new_string))
print(case_mod)

输出结果:

['M_FRST_RD']

但需要生成所有可能的替换组合(包含多单词组合的缩写),期望输出:

['M_FRST_RD', 'MF_RD', 'M_FRD', 'MFR']

已能拆分出所有可能的子串,但无法将拆分与替换逻辑结合,以下是解决方案:


解决方案

核心思路是枚举所有不重叠的连续子串分割方式,确保每个子串都存在于查找表中,再将每个子串替换为对应缩写后拼接,最终去重得到所有结果。

实现代码

case = ["MY_FIRST_RODEO"]
lookup = {'MY': 'M', 'FIRST': 'FRST', 'RODEO' : 'RD', 'FIRST_RODEO': 'FRD', 'MY_FIRST': 'MF', 'MY_FIRST_RODEO': 'MFR'}

def generate_all_abbreviations(words, lookup):
    results = set()
    n = len(words)
    
    def backtrack(start, current_parts):
        if start == n:
            results.add("_".join(current_parts))
            return
        # 尝试从start开始的所有可能长度的连续子串
        for end in range(start + 1, n + 1):
            substring = "_".join(words[start:end])
            if substring in lookup:
                backtrack(end, current_parts + [lookup[substring]])
    
    backtrack(0, [])
    return sorted(results)

for string in case:
    words = string.split("_")
    all_abbrs = generate_all_abbreviations(words, lookup)
    print(all_abbrs)

输出结果

['M_FRST_RD', 'M_FRD', 'MF_RD', 'MFR']

逻辑说明

  1. 使用回溯法遍历所有可能的分割点:从当前起始索引start出发,尝试所有可能的结束索引end,将words[start:end]拼接成子串。
  2. 若子串存在于查找表中,则将其对应的缩写加入当前片段列表,继续递归处理剩余的单词。
  3. 当处理完所有单词(start == n),将拼接后的缩写字符串存入集合(自动去重)。
  4. 最后返回排序后的结果集合。

内容的提问来源于stack exchange,提问作者flying_fluid_four

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 07:10:14