Python 为什么这是错误的(排列)?

Python 为什么这是错误的(排列)?,python,python-3.x,Python,Python 3.x,问题:给定两个字符串s1和s2,如果s2包含s1的置换,则编写一个函数返回true。换句话说,第一个字符串的一个排列是第二个字符串的子字符串 (来自Leetcode) 示例: 输入: s1 = "ab" s2 = "eidbaooo" s1= "ab" s2 = "eidboaoo" 输出:True 说明:s2包含一个s1(“ba”)的排列 输入: s1 = "ab" s2 = "e

问题:给定两个字符串s1和s2,如果s2包含s1的置换,则编写一个函数返回true。换句话说,第一个字符串的一个排列是第二个字符串的子字符串

(来自Leetcode)

示例:

输入:

s1 = "ab"
s2 = "eidbaooo"
s1= "ab"
s2 = "eidboaoo"
输出:
True

说明:
s2
包含一个
s1
(“ba”)的排列

输入:

s1 = "ab"
s2 = "eidbaooo"
s1= "ab"
s2 = "eidboaoo"
输出:
False

isperm = False
for i in range(len(s2)-len(s1)+1):
    if sorted(s2[i : i+len(s1)]) == sorted(s1):
        isperm = True
return isperm
你可以试试这个

import itertools as itt
def isPerm(s1, s2):
    for s in itt.permutations(s1, len(s1)):
        if ''.join(s) in s2:
            return True
    return False

s1= "ab"
s2 = "eidboaoo"
isPerm(s1, s2)

您的算法是一种蛮力,对于这个问题以及LeetCode上的大多数中等和困难问题来说,并不是理想的解决方案

这将通过:

class Solution:
    def checkInclusion(self, a, b):
        count_map_a = collections.Counter(a)
        count_map_b = collections.Counter(b[:len(a)])

        for i in range(len(a), len(b)):
            if count_map_a == count_map_b:
                return True

            count_map_b[b[i]] += 1
            count_map_b[b[i - len(a)]] -= 1
            if count_map_b[b[i - len(a)]] == 0:
                del(count_map_b[b[i - len(a)]])

        return count_map_b == count_map_a
对于这个问题,我们不需要使用
sorted
。相反,我们将使用两个
计数器

Sorted是一个O(N logn)的时间复杂度,当我们在一个N阶的for循环中运行它时,时间复杂度将变成O(N^2 logn)。我们的目标是首先找到最有效的算法,以最低的时间复杂度,然后我们可能会考虑将我们的内存减少到最低。
工具书类
  • 有关更多详细信息,请参阅,您可以在其中找到大量解释良好的公认解决方案,包括各种有效算法和渐近/复杂性分析

  • 蛮力算法通常被接受的问题。对于和问题,大约90%的情况下,蛮力算法的失败主要是由于(TLE)错误,而较少是由于超过内存限制(MLE)错误


那么您要问的代码有什么问题?这听起来真是个糟糕的问题idea@mad物理学家:为什么会这样?因为如果第一个字符串包含多于两个元素,你将永远野蛮地执行一项本应快速完成的任务。