所以这是我的代码:
def word_score(string1, string2):
'''Returns the word score for two strings'''
if len(string1) == 0 or len(string2) == 0:
return 0
else:
if string1[0] in string2:
return 1 + word_score(string1[1:], string2)
else:
return word_score(string1[1:], string2)
基本上,对于每个字符串之间共享的每个字母,分数应该增加1。但是不应该重复,但我的代码有时会根据输出重复字母。我必须为此使用递归,并且不能使用map或key之类的东西,因为我们还没有在课堂上学到这一点。这个实验室的任务非常棘手,我试过调试,所有的同学都被困在周二。
下面是一些不起作用的输出以及它们应该返回的内容:
word_score('always', 'walking')
返回4,但应该返回3,因为重复有一个额外的
word_score('recursion', 'excursion')
返回9,但由于重复
正确的输出:
word_score('diner', 'syrup')
正确返回1
word_score('always', 'bananas')
正确返回3
答案 0 :(得分:1)
假设您无法使用set
,dict
或Counter
,一种方法是逐个迭代string1
中的字符并使用{{ 3}}检查是否可以从string2
找到它。如果找到了字符,则通过组合匹配索引之前和之后的切片,将1
添加到结果并构造新的string2
:
def word_score(string1, string2):
if not string1 or not string2:
return 0
index = string2.find(string1[0])
if index != -1:
return 1 + word_score(string1[1:], string2[:index] + string2[index+1:])
else:
return word_score(string1[1:], string2)
TEST_CASES = [
['always', 'walking'],
['recursion', 'excursion'],
['diner', 'syrup'],
['always', 'bananas']
]
for s1, s2 in TEST_CASES:
print('word_score({}, {}) -> {}'.format(s1, s2, word_score(s1, s2)))
输出:
word_score(always, walking) -> 3
word_score(recursion, excursion) -> 8
word_score(diner, syrup) -> 1
word_score(always, bananas) -> 3
<强>更新强>
假设str
方法不可用,您可以自行轻松实施搜索,假设允许str.find
和range
:
def word_score(string1, string2):
if not string1 or not string2:
return 0
for i in range(len(string2)):
if string1[0] == string2[i]:
return 1 + word_score(string1[1:], string2[:i] + string2[i+1:])
return word_score(string1[1:], string2)
答案 1 :(得分:0)
您可以在列表中转换str,然后在一组中转换以消除重复项并检查交叉点。
def word_score(string1, string2):
'''Returns the word score for two strings'''
string1=list(string1)
string2=list(string2)
string1=set(string1)
string2=set(string2)
if len(string1) == 0 or len(string2) == 0:
return 0
else:
return len((string1.intersection(string2)))
编辑你不能使用交集,但列表和,而你可以使用吗?
def word_score2(string1, string2):
'''Returns the word score for two strings'''
string_temp1=list(string1)
string_temp2=list(string2)
if len(string_temp1) == 0 or len(string_temp2) == 0:
return 0
else:
if string_temp1[0] in string_temp2:
while string1[0] in string_temp1:
string_temp1.remove(string1[0])
return 1 + word_score2(string_temp1, string_temp2)
else:
return word_score2(string_temp1[1:], string_temp2)
答案 2 :(得分:0)
当出现“肯定匹配”时,您可以尝试“擦除”第二个字母的字母。 这样,您的重复问题就会消失。