如何识别两字符串列表错位元素并标记存入第三列表?
解决方案
核心思路是通过**最长公共子序列(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']
说明
get_lcs_indices函数通过动态规划找到两个列表中顺序完全一致的元素的索引对,这些元素属于最长公共子序列,是未被打乱顺序的部分。mark_disordered_elements函数遍历两个列表,对比当前元素是否属于LCS的对应位置:- 若不属于,对
ordered_list的元素添加&前缀,对unordered_list的元素添加%前缀。
- 若不属于,对
- 该方法能适配所有元素完全相同、仅位置错位的场景,避免了逐索引对比导致的误标记问题。
内容的提问来源于stack exchange,提问作者JSM
相关产品推荐
相关产品推荐

