题目描述
给定两个字符串 s1 和 s2,写一个函数来判断 s2 是否包含 s1 的某个变位词。
换句话说,第一个字符串的排列之一是第二个字符串的 子串 。
示例
示例 1:
输入: s1 = “ab” s2 = “eidbaooo” 输出: True 解释: s2 包含 s1 的排列之一 (“ba”). 示例 2:
输入: s1= “ab” s2 = “eidboaoo” 输出: False
来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/MPnaiL 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
方法
我们对第一个字符串根据字符建立一个计数器,然后遍历建立长度等于第一个字符串的第二个字符串的子串的计数器,依次比较两个计数器,相等返回True。 特殊处理:当第一个字符串的长度大于第二个字符串时,直接返回False。
class Solution:
def checkInclusion(self, s1: str, s2: str) -> bool:
s1_counter = Counter()
s2_counter = Counter()
n1, n2 = len(s1), len(s2)
if n1 > n2:
return False
for i in s1:
s1_counter[i] += 1
for i in range(n1-1):
s2_counter[s2[i]] += 1
for i in range(n1-1, n2):
s2_counter[s2[i]] += 1
if s1_counter == s2_counter:
return True
s2_counter[s2[i-n1+1]] -= 1
return False
|