【发布时间】:2018-02-16 14:41:40
【问题描述】:
我有以下问题,我找到了这个Permutation of string as substring of another,但这是使用 C++,我对应用 python 有点困惑。
给定两个字符串 s 和 t,判断 t 的某个字谜是否是 s 的子串。例如:如果 s = "udacity" 和 t = "ad",那么 函数返回 True。您的函数定义应如下所示: question1(s, t) 并返回布尔值 True 或 False。
所以我回答了这个问题,但他们希望我使用字典而不是排序字符串。审稿人这么说;
我们可以首先为 t 编译一个计数字典并检查每个 s 中可能的连续子串集。如果任何集合是 t 的字谜, 然后我们返回 True,否则返回 False。比较所有字符的计数 将可以在恒定时间内完成,因为数量有限 要检查的字符数。循环遍历所有可能的连续 子字符串将采用最坏情况 O(len(s))。因此,时间 该算法的复杂度为 O(len(s))。空间复杂度为 O(1) 虽然我们正在创建一个字典,因为我们最多可以有 26 个 字符,因此它是有界的。
请各位帮忙看看如何在我的解决方案中使用字典。
这是我的解决方案;
# Check if s1 and s2 are anagram to each other
def anagram_check(s1, s2):
# sorted returns a new list and compare
return sorted(s1) == sorted(s2)
# Check if anagram of t is a substring of s
def question1(s, t):
for i in range(len(s) - len(t) + 1):
if anagram_check(s[i: i+len(t)], t):
return True
return False
def main():
print question1("udacity", "city")
if __name__ == '__main__':
main()
'''
Test Case 1: question1("udacity", "city") -- True
Test Case 2: question1("udacity", "ud") -- True
Test Case 3: question1("udacity", "ljljl") -- False
'''
感谢任何帮助。谢谢,
【问题讨论】:
-
我投票决定将此问题作为离题结束,因为家庭作业是针对家庭的。
-
审稿人所说的“我们可以先编译一个 t 的计数字典”是什么意思
-
@JoeIddon 创建一个包含 26 个条目的数组以保存 t 中的字母数,然后使用大小为 len(t) 的滑动窗口对 s 执行相同操作(因此计数不会改变或一个字母向前移动时减少而另一个增加),比较字典是 O(1),因为条目数是恒定的 (26)。
-
@maraca 帽子是有道理的,不得不考虑一下 lol - 字母表中有 26 个字母 :)
-
@maraca 在想,为什么还要将计数存储在
dict中,为什么不直接将它们与s的计数进行比较?
标签: python algorithm sorting anagram