def anagram(s1, s2):
s1 = list(s1)
s2 = list(s2)
s1.sort()
s2.sort()
return s1 == s2
def Question1(t, s):
t_len = len(t)
s_len = len(s)
t_sort = sorted(t)
for start in range(s_len - t_len + 1):
if anagram(s[start: start+t_len], t):
return True
return False
print Question1("app", "paple")
我正在处理一些练习技术面试问题,并且我坚持以下问题:
Find whether an anagram of string t is a substring of s
我已经计算出了我的代码的以下两个变体,我相信这个解决方案在于两者之间的交叉。我遇到的问题是第一个代码始终打印False.
,无论输入如何。第二种变化在某种程度上起作用。但是,它无法对单个字母进行排序。例如,t=jks s=jksd
将打印True!
,但t=kjs s=jksd
将打印False.
def Question1():
# Define strings as raw user input.
t = raw_input("Enter phrase t:")
s = raw_input("Enter phrase s:")
# Use the sorted function to find if t in s
if sorted(t.lower()) in sorted(s.lower()):
print("True!")
else:
print("False.")
Question1()
工作变体:
def Question1():
# Define strings as raw user input.
t = raw_input("Enter phrase t:")
s = raw_input("Enter phrase s:")
# use a loop to find if t is in s.
if t.lower() in s.lower():
print("True!")
else:
print("False.")
Question1()
我相信这两者之间存在一种解决方案,但我在这种情况下无法弄清楚如何使用sorted
。
答案 0 :(得分:4)
你正走在正确的轨道上。首先,请注意第二次尝试没有循环。
问题在于,您不能简单地对所有进行排序,然后在其中查找排序(t)。相反,您必须考虑s的每个len(t)大小的子字符串,并针对排序的t检查 。考虑一些简单的例子:
t = "abd"
s = "abdc"
s 平凡包含 t 。但是,当您对它们进行排序时,会得到字符串 abd 和 abcd ,并且 比较失败。排序中还有其他字母。
相反,您需要以 t 的大小逐步浏览 s 。
t_len = len(t)
s_len = len(s)
t_sort = sorted(t)
for start in range(s_len - t_len + 1):
chunk = s[start:start+t_len]
if t_sort == sorted(chunk):
# SUCCESS!!
答案 1 :(得分:2)
我认为你的问题在于" substring"需求。如果你排序,你就会破坏秩序。这意味着虽然你可以确定string1的字谜是string2的子字符串的字谜,但在你按顺序处理string2之前,你不会得到正确的答案。
我建议迭代len(s1)
中所有长度为s2
的子字符串。这是一个简单的循环。获得子字符串后,可以将它们(已排序与已排序)与s1
进行比较,以确定是否存在s1
的重新排列,从而产生s2
的连续子字符串。
即:
s1 = "jks"
s2 = "aksjd"
print('s1=',s1, ' s2=', s2)
for offset in range(len(s2) - len(s1) + 1):
ss2 = s2[offset:offset+len(s1)]
if sorted(ss2) == sorted(s1):
print('{} is an anagram of {} at offset {} in {}'.format(ss2, s1, offset, s2))