题目链接: https://leetcode.cn/problems/valid-anagram
- 异位词的要求是s与t两个字符串里面所有字符出现的次数一致
- 只需要统计并对比s与t内各个字符的数量是否相等即可
func isAnagram(s string, t string) bool {
if len(s)!=len(t){
return false
}
sMap:=map[rune]int{}
// 统计s里面每个字符出现的次数
for _,item:=range s{
sMap[item]+=1
}
// 遍历t,逐次减去sMap中的次数,如果小于0则说明t中某个字符出现的次数大于t
for _,item:=range t{
sMap[item]-=1
if sMap[item]<0{
return false
}
}
return true
}
-
时间复杂度: 时间复杂度是
$$O(n)$$ -
空间复杂度: 空间复杂度是
$$O(n)$$
- 先将每个字符串转成byte数组,并进行排序
- 将排序后的byte数组转成string,若异位词,则排序后应该形成相同的字符串,所以只用对比排序后转换成的字符串是否相等即可
func isAnagram(s string, t string) bool {
s1, s2 := []byte(s), []byte(t)
sort.Slice(s1, func(i, j int) bool { return s1[i] < s1[j] })
sort.Slice(s2, func(i, j int) bool { return s2[i] < s2[j] })
return string(s1) == string(s2)
}
-
时间复杂度: 时间复杂度是
$$O(n)$$ ,将byte数组转成字符串或字符串转成byte数组需要的时间服务度均为$$O(n)$$,排序的时间复杂度根据golang底层实现判断 -
空间复杂度: 空间复杂度是
$$O(n)$$