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