Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用set()解决“是一个距离”_Python_Set - Fatal编程技术网

Python 使用set()解决“是一个距离”

Python 使用set()解决“是一个距离”,python,set,Python,Set,我正在学习我的课程。我正在处理的问题是获取两个字符串,并确定它们是否彼此“一次编辑”。这意味着您可以从一个字符串中进行单个更改—更改一个字母、添加一个字母、删除一个字母—并使其与另一个相同 示例: s1a = "abcde" s1b = "abfde" s2a = "abcde" s2b = "abde" s3a = "xyz" s3b = "xyaz" s1a将“c”更改为“f”。 s2a删除“c”。 s3a添加了“a”。 讲师解决方案和测试套件: def is_one_away(s1,

我正在学习我的课程。我正在处理的问题是获取两个字符串,并确定它们是否彼此“一次编辑”。这意味着您可以从一个字符串中进行单个更改—更改一个字母、添加一个字母、删除一个字母—并使其与另一个相同

示例:

s1a = "abcde"
s1b = "abfde"

s2a = "abcde"
s2b = "abde"

s3a = "xyz"
s3b = "xyaz"
s1a将“c”更改为“f”。 s2a删除“c”。 s3a添加了“a”。 讲师解决方案和测试套件:

def is_one_away(s1, s2):
    if len(s1) - len(s2) >= 2 or len(s2) - len(s1) >= 2:
        return False
    elif len(s1) == len(s2):
        return is_one_away_same_length(s1, s2)
    elif len(s1) > len(s2):
        return is_one_away_diff_lengths(s1, s2)
    else:
        return is_one_away_diff_lengths(s2, s1)


def is_one_away_same_length(s1, s2):
    count_diff = 0
    for i in range(len(s1)):
        if not s1[i] == s2[i]:
            count_diff += 1
            if count_diff > 1:
                return False
    return True


# Assumption: len(s1) == len(s2) + 1
def is_one_away_diff_lengths(s1, s2):
    i = 0
    count_diff = 0
    while i < len(s2):
        if s1[i + count_diff] == s2[i]:
            i += 1
        else:
            count_diff += 1
            if count_diff > 1:
                return False
    return True


# NOTE: The following input values will be used for testing your solution.
print(is_one_away("abcde", "abcd"))  # should return True
print(is_one_away("abde", "abcde"))  # should return True
print(is_one_away("a", "a"))  # should return True
print(is_one_away("abcdef", "abqdef"))  # should return True
print(is_one_away("abcdef", "abccef"))  # should return True
print(is_one_away("abcdef", "abcde"))  # should return True
print(is_one_away("aaa", "abc"))  # should return False
print(is_one_away("abcde", "abc"))  # should return False
print(is_one_away("abc", "abcde"))  # should return False
print(is_one_away("abc", "bcc"))  # should return False
当我在线运行我的解决方案时,您可以在课程本身中进行测试 我在最后一个测试套件项目上失败:

False != True : 
Input 1: abc
Input 2: bcc
Expected Result: False
Actual Result: True
我试了又试,但我不能让最后一个测试项目工作,至少不能不打破一堆其他东西


无法保证我可以用基于集合的解决方案解决完整的测试套件,但由于我离测试项目只有一项之遥,我真的很想看看我是否能完成测试。

这无法通过此测试,因为您只查看唯一的字符:

这是一组长度为1的字符,但有两个字符已更改。通过转换为集合,您只会看到s2输入中至少有一个“c”字符,而不是现在有两个

另一种失败的方法是,如果字符的顺序发生了变化。”“abc”是“cba”的两个变化,但您的方法也无法检测到这些变化


使用集合无法解决此问题,因为集合会删除两条重要信息:字符出现的次数以及字符的排列顺序。

这无法通过此测试,因为您只查看唯一的字符:

这是一组长度为1的字符,但有两个字符已更改。通过转换为集合,您只会看到s2输入中至少有一个“c”字符,而不是现在有两个

另一种失败的方法是,如果字符的顺序发生了变化。”“abc”是“cba”的两个变化,但您的方法也无法检测到这些变化


使用集合无法解决此问题,因为集合会删除两条重要信息:字符出现的次数以及字符的排列顺序。

下面是一个使用列表理解中的差异的解决方案

def one_away(s1, s2):
    diff1 = [el for el in s1 if el not in s2]
    diff2 = [el for el in s2 if el not in s1]
    if len(diff1) < 2 and len(diff2) < 2:
        return True
    return False

与基于集合的解决方案不同,此解决方案不会丢失有关非唯一字符的重要信息。

下面是一个使用列表理解中发现的差异的解决方案

def one_away(s1, s2):
    diff1 = [el for el in s1 if el not in s2]
    diff2 = [el for el in s2 if el not in s1]
    if len(diff1) < 2 and len(diff2) < 2:
        return True
    return False

与基于集合的解决方案不同,此解决方案不会丢失有关非唯一字符的重要信息。

这里是在集合用于查找唯一字符的地方解决一个问题。未完全使用set,但set用于查找两个给定字符串中的唯一字符。列表作为堆栈用于从两个堆栈中弹出项,然后比较它们

使用堆栈,从两个项目中弹出项目,并查看它们是否匹配。 找到唯一字符项,当弹出的项与唯一字符匹配时,我们需要再次弹出第一个字符串

例如,当s被发现时,我们应该再次弹出。 pales pale将是真的,因为s是唯一的字符,当s被弹出时,我们将再次弹出string1。如果未匹配的弹出字符大于1,则可以返回False

定义一个警告字符串1:str,字符串2:str->bool: string1,string2=[string1.replace中的字符对应,.lower],[string2.replace中的字符对应,.lower] 如果lenstring2>lenstring1: string1,string2=string2,string1 len_s1,len_s2,unmatch_count=lenstring1,lenstring2,0 如果len_s1==len_s2或len_s1-len_s2==1: unique_char=listsetstring1-setstring2或[无] 如果unique_char[0]==None且len_s1-len_s2==1: 返回True这是针对abcc abc的 当lenstring1>0时: pop_1,pop_2=string1.pop,string2.pop 如果pop_1==unique_char[0]和len_s1-len_s2==1: pop_1=string1.pop 如果pop_1!=流行音乐2: 不匹配计数+=1 如果不匹配计数>1: 返回错误 返回真值 返回错误 例如测试:

字符串=[abc,ab,pale,bale,ples,pale,pale,pale,pale,pale,pale,pale,ple,abc,cab,pale,bake] 对于字符串中的字符串: printf{string}one_away:{one_awaystring[0],string[1]}
这里是解决一个远离集合是用来找到唯一的字符。未完全使用set,但set用于查找两个给定字符串中的唯一字符。列表作为堆栈用于从两个堆栈中弹出项,然后比较它们

使用堆栈,从两个项目中弹出项目,并查看它们是否匹配。 找到唯一字符项,当弹出的项与唯一字符匹配时,我们需要再次弹出第一个字符串

例如,当s被发现时,我们应该再次弹出。 pales pale将是真的,因为s是唯一的字符,当s被弹出时,我们将再次弹出string1。如果未匹配的弹出字符大于1,则可以返回False

定义一个字符串1:str,字符串2:str- >布尔: string1,string2=[string1.replace中的字符对应,.lower],[string2.replace中的字符对应,.lower] 如果lenstring2>lenstring1: string1,string2=string2,string1 len_s1,len_s2,unmatch_count=lenstring1,lenstring2,0 如果len_s1==len_s2或len_s1-len_s2==1: unique_char=listsetstring1-setstring2或[无] 如果unique_char[0]==None且len_s1-len_s2==1: 返回True这是针对abcc abc的 当lenstring1>0时: pop_1,pop_2=string1.pop,string2.pop 如果pop_1==unique_char[0]和len_s1-len_s2==1: pop_1=string1.pop 如果pop_1!=流行音乐2: 不匹配计数+=1 如果不匹配计数>1: 返回错误 返回真值 返回错误 例如测试:

字符串=[abc,ab,pale,bale,ples,pale,pale,pale,pale,pale,pale,pale,ple,abc,cab,pale,bake] 对于字符串中的字符串: printf{string}one_away:{one_awaystring[0],string[1]}
最后一个测试套件应该返回False。您的解决方案返回True,最后一个测试套件应返回False。您的解决方案返回True,
def one_away(s1, s2):
    diff1 = [el for el in s1 if el not in s2]
    diff2 = [el for el in s2 if el not in s1]
    if len(diff1) < 2 and len(diff2) < 2:
        return True
    return False
('pale', 'bale') one_away: True
('ples', 'pale') one_away: False
('palee', 'pale') one_away: True
('pales', 'pale') one_away: True
('pale', 'ple') one_away: True
('abc', 'cab') one_away: False
('pale', 'bake') one_away: False