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

如何识别两字符串列表错位元素并标记存入第三列表?

解决方案

核心思路是通过**最长公共子序列(LCS)**识别两个列表中顺序一致的元素,剩余元素即为破坏整体顺序的错位元素,再按规则标记。

代码实现

def get_lcs_indices(ordered, unordered):
    m, n = len(ordered), len(unordered)
    # 构建DP表计算LCS长度
    dp = [[0] * (n + 1) for _ in range(m + 1)]
    for i in range(1, m + 1):
        for j in range(1, n + 1):
            if ordered[i-1] == unordered[j-1]:
                dp[i][j] = dp[i-1][j-1] + 1
            else:
                dp[i][j] = max(dp[i-1][j], dp[i][j-1])
    # 回溯获取LCS对应的索引对
    i, j = m, n
    lcs_indices = []
    while i > 0 and j > 0:
        if ordered[i-1] == unordered[j-1]:
            lcs_indices.append((i-1, j-1))
            i -= 1
            j -= 1
        elif dp[i-1][j] > dp[i][j-1]:
            i -= 1
        else:
            j -= 1
    lcs_indices.reverse()
    return lcs_indices

def mark_disordered_elements(ordered_list, unordered_list):
    lcs_indices = get_lcs_indices(ordered_list, unordered_list)
    
    # 标记ordered_list中的错位元素
    marked_ordered = []
    lcs_ptr = 0
    lcs_len = len(lcs_indices)
    for idx, elem in enumerate(ordered_list):
        if lcs_ptr < lcs_len and idx == lcs_indices[lcs_ptr][0]:
            marked_ordered.append(elem)
            lcs_ptr += 1
        else:
            marked_ordered.append(f"&{elem}")
    
    # 标记unordered_list中的错位元素
    marked_unordered = []
    lcs_ptr = 0
    for idx, elem in enumerate(unordered_list):
        if lcs_ptr < lcs_len and idx == lcs_indices[lcs_ptr][1]:
            marked_unordered.append(elem)
            lcs_ptr += 1
        else:
            marked_unordered.append(f"%{elem}")
    
    # 返回结果,包含两个标记后的列表
    return {
        "marked_ordered": marked_ordered,
        "marked_unordered": marked_unordered
    }

使用示例

# 示例1:相邻元素错位
ordered = ["a", "b", "c", "d", "e"]
unordered = ["a", "c", "b", "d", "e"]
result = mark_disordered_elements(ordered, unordered)
print(result["marked_ordered"])  # 输出: ['a', '&b', '&c', 'd', 'e']
print(result["marked_unordered"])  # 输出: ['a', '%c', '%b', 'd', 'e']

# 示例2:单个元素插入到前面
ordered = ["x", "y", "z", "w"]
unordered = ["x", "w", "y", "z"]
result = mark_disordered_elements(ordered, unordered)
print(result["marked_ordered"])  # 输出: ['x', '&y', '&z', '&w']
print(result["marked_unordered"])  # 输出: ['x', '%w', '%y', '%z']

说明

  1. get_lcs_indices函数通过动态规划找到两个列表中顺序完全一致的元素的索引对,这些元素属于最长公共子序列,是未被打乱顺序的部分。
  2. mark_disordered_elements函数遍历两个列表,对比当前元素是否属于LCS的对应位置:
    • 若不属于,对ordered_list的元素添加&前缀,对unordered_list的元素添加%前缀。
  3. 该方法能适配所有元素完全相同、仅位置错位的场景,避免了逐索引对比导致的误标记问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 07:56:03