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

Python中如何给字符串字符分配相对权重并按字符间距排序实现有序匹配

双字符串最长顺序匹配实现方案

你描述的需求本质是经典的**最长公共子序列(LCS)**问题,不需要手动为字符分配权重,标准的动态规划方案就能直接满足“保留两个字符串的相对顺序、取最长匹配结果”的要求。

实现逻辑

最长公共子序列的定义就是:从两个原字符串中分别删除部分字符(也可以不删除),不改变剩余字符相对顺序得到的公共字符串,长度最长的结果就是你需要的输出。

步骤1:构建动态规划DP表

  • 设长字符串larger长度为m,短字符串smaller长度为n
  • 创建一个(m+1) * (n+1)的二维数组dp,dp[i][j]的含义是larger前i个字符、smaller前j个字符能得到的最长公共子序列长度
  • 状态转移规则:
    • 如果larger[i-1] == smaller[j-1],说明当前字符匹配,dp[i][j] = dp[i-1][j-1] + 1
    • 如果不相等,dp[i][j] = max(dp[i-1][j], dp[i][j-1]),取“放弃长串当前字符”、“放弃短串当前字符”两种方案的更优值

步骤2:回溯DP表得到具体匹配结果

DP表构建完成后,从右下角dp[m][n]的位置反向遍历:

  • 如果当前两个字符相等,就把这个字符加入结果列表,同时向左上角移动(i和j都减1)
  • 如果不相等,就往dp值更大的方向移动(向上或向左),如果两个方向值相等可任选,优先选向上的方向可以得到长串中更连续的结果
  • 最后把反向收集的结果反转,就得到最终的顺序正确的最长匹配字符串

代码实现

def longest_common_subsequence(larger: str, smaller: str) -> str:
    m, n = len(larger), len(smaller)
    # 初始化DP表
    dp = [[0]*(n+1) for _ in range(m+1)]
    for i in range(1, m+1):
        for j in range(1, n+1):
            if larger[i-1] == smaller[j-1]:
                dp[i][j] = dp[i-1][j-1] + 1
            else:
                dp[i][j] = max(dp[i-1][j], dp[i][j-1])
    # 回溯获取结果
    i, j = m, n
    res = []
    while i > 0 and j > 0:
        if larger[i-1] == smaller[j-1]:
            res.append(larger[i-1])
            i -= 1
            j -= 1
        # dp值相等时优先走长串方向,保障连续性更高
        elif dp[i-1][j] >= dp[i][j-1]:
            i -= 1
        else:
            j -= 1
    # 反转得到正向结果
    return ''.join(reversed(res))

# 测试你的示例
larger_txt = "absdfgdsfhsrbbfsdc"
smaller_txt = "dsdfbdfdef"
print(longest_common_subsequence(larger_txt, smaller_txt))
# 输出结果:sdfbfd,和预期完全一致

扩展说明

如果需要自定义权重规则,比如给某些特定字符更高的优先级,可以修改状态转移时的加分逻辑:匹配到高权重字符时加大于1的权重值,最后回溯时优先取权重总和更高的路径即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 22:36:03