567. 字符串的排列

字符串的排列

题目描述:

给定两个字符串 s1 和 s2,写一个函数来判断 s2 是否包含 s1 的排列。

换句话说,第一个字符串的排列之一是第二个字符串的 子串 。

示例 1:

输入: s1 = “ab” s2 = “eidbaooo”
输出: True
解释: s2 包含 s1 的排列之一 (“ba”).
示例 2:

输入: s1= “ab” s2 = “eidboaoo”
输出: False

思路:

判断相不相等就是判断26个字母的个数相不相等,用滑动窗口法,第一次传入len(s1)开始判断,移动一次第一个字母的数量减去,加上最后一个字母的数量

代码:

func checkInclusion(s1 string, s2 string) bool {
    if len(s1) > len(s2) {
        return false
    } 
    mp := make(map[byte]int,26)
    mp2 := make(map[byte]int,26)
    for i:=0;i<len(s1);i++{
        mp[s1[i]]++
        mp2[s2[i]]++
    }
    if check(mp,mp2)==true{
        return true
    }
    for i:=len(s1);i<len(s2);i++{
        mp2[s2[i-len(s1)]]--
        mp2[s2[i]]++
        if check(mp,mp2)==true{
            return true
        }
    }
    return  false
}
func check(mp1 map[byte]int,mp2 map[byte]int) bool {
    var i byte
    for i='a';i<'z';i++{
        if mp1[i]!=mp2[i]{
            return false
        }
    }
    return true
}

代码效率:

执行用时:12 ms, 在所有 Go 提交中击败了43.98%的用户
内存消耗:2.6 MB, 在所有 Go 提交中击败了23.90%的用户


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!