題目:給定兩個字符串 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