class Solution {
public:
bool checkInclusion(string s1, string s2) {
}
};
剑指 Offer II 014. 字符串中的变位词
给定两个字符串 s1
和 s2
,写一个函数来判断 s2
是否包含 s1
的某个变位词。
换句话说,第一个字符串的排列之一是第二个字符串的 子串 。
示例 1:
输入: s1 = "ab" s2 = "eidbaooo" 输出: True 解释: s2 包含 s1 的排列之一 ("ba").
示例 2:
输入: s1= "ab" s2 = "eidboaoo" 输出: False
提示:
1 <= s1.length, s2.length <= 104
s1
和 s2
仅包含小写字母
注意:本题与主站 567 题相同: https://leetcode.cn/problems/permutation-in-string/
原站题解
golang 解法, 执行用时: 4 ms, 内存消耗: 2.4 MB, 提交时间: 2022-11-23 16:01:22
func checkInclusion(s1, s2 string) bool { n, m := len(s1), len(s2) if n > m { return false } cnt := [26]int{} for _, ch := range s1 { cnt[ch-'a']-- } left := 0 for right, ch := range s2 { x := ch - 'a' cnt[x]++ for cnt[x] > 0 { cnt[s2[left]-'a']-- left++ } if right-left+1 == n { return true } } return false }
golang 解法, 执行用时: 0 ms, 内存消耗: 2.4 MB, 提交时间: 2022-11-23 16:01:02
func checkInclusion(s1, s2 string) bool { n, m := len(s1), len(s2) if n > m { return false } cnt := [26]int{} for i, ch := range s1 { cnt[ch-'a']-- cnt[s2[i]-'a']++ } diff := 0 for _, c := range cnt[:] { if c != 0 { diff++ } } if diff == 0 { return true } for i := n; i < m; i++ { x, y := s2[i]-'a', s2[i-n]-'a' if x == y { continue } if cnt[x] == 0 { diff++ } cnt[x]++ if cnt[x] == 0 { diff-- } if cnt[y] == 0 { diff++ } cnt[y]-- if cnt[y] == 0 { diff-- } if diff == 0 { return true } } return false }
golang 解法, 执行用时: 4 ms, 内存消耗: 2.4 MB, 提交时间: 2022-11-23 16:00:19
func checkInclusion(s1 string, s2 string) bool { n1, n2 := len(s1), len(s2) if n1 > n2 { return false } var cnt1, cnt2 [26]int for i, ch := range s1 { cnt1[ch-'a']++ cnt2[s2[i]-'a']++ } if cnt1 == cnt2 { return true } for i := n1; i < n2; i++ { cnt2[s2[i]-'a']++ cnt2[s2[i-n1]-'a']-- if cnt1 == cnt2 { return true } } return false }