567. 字符串的排列
给你两个字符串 s1 和 s2 ,写一个函数来判断 s2 是否包含 s1 的排列。如果是,返回 true ;否则,返回 false 。
换句话说,s1 的排列之一是 s2 的 子串 。
常规解法
func checkInclusion(_ s1: String, _ s2: String) -> Bool {
var dic1: [Character : Int] = [:]
for char in s1{
dic1.updateValue((dic1[char] ?? 0) + 1, forKey: char)
}
let str2 = Array(s2)
var dic2: [Character : Int] = [:]
var start = -1
for (index,char) in str2.enumerated(){
if index >= s1.count{
start += 1
let startChar = str2[start]
if dic2[startChar] == 1{
dic2.removeValue(forKey: startChar)
}else{
dic2.updateValue((dic2[startChar] ?? 0)-1, forKey: startChar)
}
}
dic2.updateValue((dic2[char] ?? 0) + 1, forKey: char)
if dic1 == dic2{
return true
}
}
return false
}
大神解法:
func checkInclusion(_ s1: String, _ s2: String) -> Bool {
var charInfo = [Int](repeating: 0, count: 26)
var s1Count = 0
for char in s1 {
if let asciiValue = char.asciiValue {
charInfo[Int(asciiValue - 97)] += 1
}
s1Count += 1
}
var s2Array = [Character]()
for char in s2 {
s2Array.append(char)
}
if s1Count > s2Array.count {
return false
}
for i in 0..<s1Count {
if let asciiValue = s2Array[i].asciiValue {
charInfo[Int(asciiValue - 97)] -= 1
}
}
func checkRusult() -> Bool {
for value in charInfo {
if value != 0 {
return false
}
}
return true
}
\
if checkRusult() {
return true
}
for i in s1Count..<s2Array.count {
let right = Int(s2Array[i].asciiValue ?? 0) - 97
let left = Int(s2Array[i - s1Count].asciiValue ?? 0) - 97
charInfo[left] += 1
charInfo[right] -= 1
if checkRusult() {
return true
}
}
return false
}