繁体   English   中英

如何比较两个字符串以返回差异数?

[英]How do I compare two strings to return number of differences?

我有两个字符串:

str1:“密码”
str2: "pss$w#rd"

我想比较两个字符串并想打印输出它们之间的差异总数

输出:

4

由于在 str2 中“a”、“o”被删除并且“$”、“#”被添加,所以总操作数为 4。

但是我的代码给出了错误的输出。 我该如何解决这个问题? 我可能会遗漏一些东西。

def getMinTotalNumChanges(str1, str2):
    # Write your code here
    totalCount = 0
    
    sorted(str1)
    sorted(str2)
    
    for i in str1:
        for j in str2:
            if i != j:
                totalCount += 1
    return totalCount
    
# driver code
str1 = "password"
str2 = "pss$wr#d"
print(getMinTotalNumChanges(str1, str2))

这是一个非常简单的 DP 问题,您只需检查删除、编辑和插入:

def getMinTotalNumChanges(str1, str2, memo=None):
    if memo is None:
        memo = {}
    if str1 == "":
        return len(str2)
    if str2 == "":
        return len(str1)
    if (str1, str2) in memo:
        return memo[(str1, str2)]
    diff = 1 if str1[0] != str2[0] else 0
    ret = min(
        # deletion
        1 + getMinTotalNumChanges(str1[1:], str2, memo),
        # edit
        diff + getMinTotalNumChanges(str1[1:], str2[1:], memo),
        # insertion
        1 + getMinTotalNumChanges(str1, str2[1:], memo)
    )
    memo[(str1, str2)] = ret
    return ret


str1 = "password"
str2 = "pss$wr#d"
print(getMinTotalNumChanges(str1, str2))

你可以很容易地通过集合来完成,但它会忽略重复字符的差异和位置差异,如 str1: "password" str2: "ps$w#rd" 也会给你结果 4。请查看以下代码:

def getMinTotalNumChanges(str1, str2):
    str1_set= set(str1)
    str2_set= set(str2)
    str_intersection=str1_set.intersection(str2_set)
    diff1=str1_set - str_intersection
    diff2=str2_set - str_intersection
    total_diff= len(diff1)+len(diff2)
    return total_diff


str1 = "password"
str2 = "pss$wr#d"
print(getMinTotalNumChanges(str1, str2))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM