Python 2.7查找一个字符串的某个字符串是否是另一个字符串的子字符串

时间:2017-03-29 20:23:28

标签: python python-2.7 boolean anagram

编辑:发布我的最终解决方案,因为这是一个非常有用的线程,我想为它添加一些终结性。使用以下两个答案的建议,我能够制定解决方案。我添加了一个辅助函数,我在其中定义了一个anagram。这是我的最终解决方案:

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

2 个答案:

答案 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))