LeetCode - 字符串排列 - Golang

題目:給定兩個字符串 s1 和 s2,寫一個函數來判斷s2是否包含s1 的排列。
換句話說,第一個字符串的排列之一是第二個字符串的子串。函數

Golang代碼實現嘗試以下:
示例1:code

輸入: s1 = "ab" s2 = "eidbaooo"
輸出: True
解釋: s2 包含 s1 的排列之一 ("ba").

示例2:字符串

輸入: s1= "ab" s2 = "eidboaoo"
輸出: False

基於Golang的代碼實現以下:class

if s1 == "" {
        return true
    }
    // s1的長度大於s2時,一定不是子串
    l1, l2 := len(s1), len(s2)
    if l1 > l2 {
        return false
    }
    // 獲取s1每一個字母的頻率
    arr1 := [26]int{}
    for _, b := range s1 {
        arr1[b-97]++
    }
    // 向右滑動次數爲兩個字符串的長度差+1
    for i := 0; i <= l2-l1; i++ {
        // tmp記錄s2子串每一個字符的頻率
        tmp := [26]int{}
        // loc記錄s2子串每一個字符的第一個位置
        loc := [26]int{}
        // 標記是否發現合適的子串
        flag := true
        // 遍歷s2的子串,若是s2的某個字符在1
        for m, b := range s2[i : i+l1] {
            // 記錄每一個字符第一次出現的位置
            if loc[b-97] == 0 {
                loc[b-97] = m + 1
            }
            // 若是某個字符的頻率大於s1中此字符的頻率,則此子串確定錯誤
            if v := arr1[b-97]; v < tmp[b-97]+1 {
                flag = false
                // 下個子串開始位置直接今後次重複字符的第一次出現以後開始
                i += loc[b-97]
                break
            }
            // 記錄子串中該字符的出現頻率
            tmp[b-97]++
        }
        // 沒有break則頻率徹底符合
        if flag {
            return true
        }
    }
    return false
相關文章
相關標籤/搜索