对于家庭作业,我必须获取 2 个用户输入的字符串,并找出有多少个常见字母(在两个字符串的相同位置),并找到常见字母。例如,对于两个字符串 ' cat' 和 'rat',有 2 个公共(public)字母位置(本例中为位置 2 和 3),公共(public)字母也是 2,因为 'a' 找到了 1 个,'t' 也找到了一次..
所以我编写了一个程序并且运行良好,但是后来我的老师用更多示例更新了作业,特别是带有重复字母的示例,而我的程序不适用于该程序。例如,使用字符串“ahahaha”和'huhu' - 相同位置有 0 个公共(public)字母,但它们之间有 3 个公共(public)字母(因为字符串 2 中的 'h' 在字符串 1 中出现了 3 次..)
我的整个问题是,如果“h”在第一个字符串中出现多次,我不知道如何计算,而且我不知道如何不检查 huhu 中的第二个“h”,因为它应该只计算唯一字母,因此总体常见字母数应为 2..
这是我当前的代码:
S1 = input("Enter a string: ")
S2 = input("Enter a string: ")
i = 0
big_string = 0
short_string = 0
same_letter = 0
common_letters = 0
if len(S1) > len(S2):
big_string = len(S1)
short_string = len(S2)
elif len(S1) < len(S2):
big_string = len(S2)
short_string = len(S1)
elif len(S1) == len(S2):
big_string = short_string = len(S1)
while i < short_string:
if (S1[i] == S2[i]) and (S1[i] in S2):
same_letter += 1
common_letters += 1
elif (S1[i] == S2[i]):
same_letter += 1
elif (S1[i] in S2):
common_letters += 1
i += 1
print("Number of positions with the same letter: ", same_letter)
print("Number of letters from S1 that are also in S2: ", common_letters)
所以这段代码适用于没有公共(public)字母的字符串,但是当我尝试将它与“ahahaha”和“huhu”一起使用时,我得到 0 个公共(public)位置(这是有道理的)和 2 个公共(public)字母(当它应该是 3 个时)。 .我想如果我尝试添加以下内容可能会起作用:
while x < short_string:
if S1[i] in S2[x]:
common_letters += 1
else:
pass
x += 1
但是这也不起作用......
我并不要求直接答案或代码来执行此操作,因为我想自己执行此操作,但我只需要一些提示或想法如何执行此操作..
注意:我不能使用我们在类里面没有学过的任何函数,并且在类里面我们只完成了基本的循环和字符串..
最佳答案
您需要一个像multidict
这样的数据结构。据我所知,标准库中最相似的数据结构是来自集合
的Counter
。
对于简单的频率计数:
>>> from collections import Counter
>>> strings = ['cat', 'rat']
>>> counters = [Counter(s) for s in strings]
>>> sum((counters[0] & counters[1]).values())
2
使用索引计数:
>>> counters = [Counter(zip(s, range(len(s)))) for s in strings]
>>> sum(counters[0] & counters[1].values())
2
对于您的示例 ahahaha
和 huhu
,您应该分别得到 2
和 0
,因为我们得到两个h
但位置错误。
由于您无法使用高级构造,因此您只需使用数组模拟计数器
即可。
- 创建 26 个元素的数组
- 循环字符串并更新每个字母的相关索引
- 同时再次循环遍历数组并对各个索引的最小值求和。
关于python - 在Python中查找两个字符串之间的共同字母,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25979084/