leetcode 567. Permutation in String 字符串的排列 滑动窗口法
生活随笔
收集整理的這篇文章主要介紹了
leetcode 567. Permutation in String 字符串的排列 滑动窗口法
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目
給定兩個字符串 s1 和 s2,寫一個函數來判斷 s2 是否包含 s1 的排列。換句話說,第一個字符串的排列之一是第二個字符串的子串。
示例1:輸入: s1 = "ab" s2 = "eidbaooo"
輸出: True
解釋: s2 包含 s1 的排列之一 ("ba").示例2:輸入: s1= "ab" s2 = "eidboaoo"
輸出: False輸入的字符串只包含小寫字母
兩個字符串的長度都在 [1, 10,000] 之間
1暴力解法(超時)
class Solution:"""暴力解法"""def perm(self, s=''):if len(s) <= 1:return [s]sl = []for i in range(len(s)):for j in self.perm(s[0:i] + s[i + 1:]):sl.append(s[i] + j)return sldef checkInclusion(self, s1, s2):""":type s1: str:type s2: str:rtype: bool"""if len(s1) > len(s2):return Falses1_perm = list(set(self.perm(s1)))for i in s1_perm:index = s2.find(i)if index != -1:return Truereturn False
使用字典的方式(超時),用java可以過
from collections import defaultdict
import operator
class Solution1:"""使用hashmap的方式"""def checkInclusion(self, s1, s2):""":type s1: str:type s2: str:rtype: bool"""if len(s1) > len(s2):return Falsemap_dict1 = defaultdict(int);map_dict2 = defaultdict(int);for i in s1:map_dict1[i] += 1for i in range(len(s2) - len(s1) + 1):for j in range(len(s1)):map_dict2[s2[i + j]] += 1if operator.eq(map_dict1, map_dict2):return Truemap_dict2.clear()return False
使用list計數的方式(超時)
class Solution2:"""使用list計數的方法"""def match(self, s1, s2):for i in range(26):if s1[i] != s2[i]:return Falsereturn Truedef checkInclusion(self, s1, s2):""":type s1: str:type s2: str:rtype: bool"""if len(s1) > len(s2):return Falselist1 = [0 for i in range(26)]for i in s1:list1[ord(i) - ord('a')] += 1for i in range(len(s2) - len(s1) + 1):list2 = [0 for i in range(26)]for j in range(len(s1)):list2[ord(s2[i + j]) - ord('a')] += 1if self.match(list1, list2):return Truereturn False
使用滑動窗口法
class Solution3:"""滑動窗口法,時間復雜度O(l1+26?(l2?l1),l1是s1的長度,l2是s2的長度"""def match(self, s1, s2):for i in range(26):if s1[i] != s2[i]:return Falsereturn Truedef checkInclusion(self, s1, s2):""":type s1: str:type s2: str:rtype: bool"""if len(s1) > len(s2):return Falselist1 = [0 for i in range(26)]list2 = [0 for i in range(26)]for i in range(len(s1)):list1[ord(s1[i]) - ord('a')] += 1list2[ord(s2[i]) - ord('a')] += 1for i in range(len(s2) - len(s1)):if self.match(list1, list2):return Truelist2[ord(s2[i + len(s1)]) - ord('a')] += 1list2[ord(s2[i]) - ord('a')] -= 1return self.match(list1, list2)
滑動窗口法進階
class Solution4:"""進階的滑動窗口法,使用count來表示26個字符頻率在s1,s2中相同個數"""def checkInclusion(self, s1, s2):""":type s1: str:type s2: str:rtype: bool"""if len(s1) > len(s2):return Falselist1 = [0 for i in range(26)]list2 = [0 for i in range(26)]for i in range(len(s1)):list1[ord(s1[i]) - ord('a')] += 1list2[ord(s2[i]) - ord('a')] += 1count = 0for i in range(26):if list1[i] == list2[i]:count += 1for i in range(len(s2) - len(s1)):r = ord(s2[i + len(s1)]) - ord('a')l = ord(s2[i]) - ord('a')if count == 26:return Truelist2[r] += 1if list2[r] == list1[r]:count += 1elif list2[r] == list1[r] + 1:count -= 1list2[l] -= 1if list2[l] == list1[l]:count += 1elif list2[l] == list1[l] - 1:count -= 1return count == 26
源碼在這
后記
更多滑動窗口法的介紹,見:
滑動窗口法詳解
總結
以上是生活随笔為你收集整理的leetcode 567. Permutation in String 字符串的排列 滑动窗口法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 关于python中的dict和defau
- 下一篇: leetcode 30. Substri