滑动窗口。。
首先。。p是s的子串的话 长度上 s要大于p
注意 这里最好是声明两个常量来表示长度 频繁的获取count时间上会有消耗 特别是在下边的循环里
然后 因为是小写字母 初始化两个长度是26的数组 和a的ascii值做差 对应的下标的值即为出现次数
先根据p来初始化 p比较短不用考虑越界问题
这样s对应的ascii的数组。就初始化了和p一样长度的
然后 继续滑动s字符串。。 前一个字符移除掉
array1[Int((temp1[i].asciiValue ?? 0) - (tempValue.asciiValue ?? 0))] -= 1
后一个字符加进来
array1[Int((temp1[i + n ].asciiValue ?? 0) - (tempValue.asciiValue ?? 0))] += 1
然后和p对应的数组进行比较 相等的话 把对应下标的值加进去
func findAnagrams(_ s: String, _ p: String) -> [Int] {
let m = s.count
let n = p.count
if n > m {
return []
}
var array = Array<Int>()
let tempValue : Character = "a"
var array1 = Array<Int>(repeating: 0, count: 26)
var array2 = Array<Int>(repeating: 0, count: 26)
let temp1 = Array(s)
let temp2 = Array(p)
for i in 0..<temp2.count {
array1[Int((temp1[i].asciiValue ?? 0) - (tempValue.asciiValue ?? 0))] += 1
array2[Int((temp2[i].asciiValue ?? 0) - (tempValue.asciiValue ?? 0))] += 1
}
if array1 == array2 {
array.append(0)
}
for i in 0..<(m - n) {
array1[Int((temp1[i].asciiValue ?? 0) - (tempValue.asciiValue ?? 0))] -= 1
array1[Int((temp1[i + n].asciiValue ?? 0) - (tempValue.asciiValue ?? 0))] += 1
if array2 == array1 {
array.append(i + 1)
}
}
return array
}
网友评论