astr = "I am a very long string and I could contain a lot of text, so think of efficiency here"
。我还有一个列表alist = ["I", "am a", "list", "of strings", "and each string", "could be made up of many words", "so think of efficiency here"]
。现在,我的字符串列表还有一个对应的整数列表alist_ofints = [1, 2, 3, 4, 5, 6, 7]
,表示此列表中每个字符串等于多少个点数。
我需要创建一个函数,找出在列表alist
中出现的单词在astr
中出现了多少次,并使用相应的点数列表alist_ofints
创建一个“点数”计数器。因此,在这个例子中,“I”,“am a”和“so think of efficiency here”各出现一次。这将给我们1*2 + 2*1 + 7*1 = 11
分。
我想出了两种简单的解决方案。第一种是创建一个函数,查看此字符串列表alist
并检查每个项是否在astr
中,如果是,则应用明显的以下逻辑。这是低效的,因为我将在astr
中查找len(alist)
次。这是一种浪费,不是吗?它很简洁明了,但效率低下。
第二个解决方案是将astr
变为单词列表,并检查从索引i
到索引j
的每个单词,其中i
是我在列表中的位置,j
是我正在寻找的alist
短语的长度。因此,“am a”是长度为2的短语(因为它有两个单词),所以我会查看i =某个数字,j =某个数字+1。如果我正在寻找短语"and each string"
,则i =某个数字,j =某个数字+3。因此,在测试此短语时,我正在查看三个单词。现在,我认为这也具有相同的时间复杂度。虽然我没有一次循环遍历astr
列表,但我要循环遍历我的单词列表alist
len(list(astr))
次。而且,我必须创建一个astr
列表,这增加了一些复杂性,我想。
因此,到目前为止,我更喜欢第一种解决方案,因为它最容易,最简单,最干净。有更好的方法吗?如果您可以找到一个列表理解方式,那就额外加分了...
谢谢
注意:我知道list(astr)
不会返回单词列表。在这个例子中,请想象它会返回。
简而言之:我有两个列表。我需要检查列表中的每个元素是否等于另一个列表中的元素,并创建一个计数器来记录它们出现的次数。除了逐个检查列表1中的每个元素与列表2中的其他元素是否相等(我认为这是O(n^2)),还有更有效的方法吗?