【问题标题】:Python 2.7 finding if some anagram of one string is a substring of another [duplicate]Python 2.7查找一个字符串的某个字谜是否是另一个[重复]的子字符串
【发布时间】:2017-08-23 12:38:36
【问题描述】:

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

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

【问题讨论】:

  • 您需要获取 t 中的所有字符组合,并对照 s 检查它们。对 s 进行排序是不对的。

标签: python python-2.7 boolean anagram


【解决方案1】:

你走在正确的轨道上。首先,请注意您的第二次尝试没有循环。

问题是您不能简单地对 all 的 s 进行排序,然后在其中查找 sorted(t)。相反,您必须考虑 s 的每个 len(t) 大小的子字符串,并根据排序的 t 检查 that。考虑一个简单的例子:

t = "abd"
s = "abdc"

s 包含 t。但是,当您对它们进行排序时,您会得到字符串 abdabcd,而 in 比较会失败。排序会妨碍其他字母。

相反,您需要以 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!!

【讨论】:

  • 显然一种正确的方式... ;-)
  • 解释得很漂亮,非常感谢您为我简化了这一点。我将此标记为此问题的答案,再次感谢您的帮助。
  • 很高兴能提供帮助。你追溯证明我在教学时得到的报酬是合理的。 :-)
【解决方案2】:

我认为您的问题在于“子字符串”要求。如果你排序,你就会破坏秩序。这意味着虽然您可以确定 string1 的字谜是 string2 的子串的字谜,但在您真正按顺序处理 string2 之前,您不会有正确的答案。

我建议遍历s2 中所有长度为len(s1) 的子字符串。这是一个简单的 for 循环。获得子字符串后,您可以将它们(排序与排序)与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))

【讨论】:

  • 我只想说这两个答案都非常有帮助,很难只选择一个正确的答案。有没有办法选择两个答案?堆栈溢出相当新
  • 不。只需选择“最有帮助”的一个(可能是您首先阅读的那个)并继续前进。周围有很多业力......
猜你喜欢
  • 1970-01-01
  • 2015-03-21
  • 2015-07-10
  • 2019-05-11
  • 1970-01-01
  • 1970-01-01
  • 2013-05-12
  • 2012-11-23
相关资源
最近更新 更多