Golang leetcode242有效字符异位词 哈希表map 排序

2024-01-07 17:47:31

有效的字母异位词 leetcode242

普通的使用map表进行记录的方法

由于题目规定只有26个小写的英文字符,因此我们直接建立26容量的map

func isAnagram(s string, t string) bool {
	//创建储存记录的map表
	sTable := make(map[int32]int, 26)
	tTable := make(map[int32]int, 26)

	//每次遍历到记录个数+1
	for _, val := range s {
		sTable[val]++
	}
	for _, val := range t {
		tTable[val]++
	}

	//如果字母个数都不一样,不是字母异位词
	if len(sTable) != len(tTable) {
		return false
	}

	//比较两个记录表是否相同
	for i, _ := range sTable {
		if sTable[i] != tTable[i] {
			return false
		}
	}
	return true

}

  • 改进后,只建立一个map表
func isAnagram(s, t string) bool {
    var c1, c2 [26]int
    for _, ch := range s {
        c1[ch-'a']++
    }
    for _, ch := range t {
        c2[ch-'a']++
    }
    return c1 == c2
}

使用字符排序的方式

直接比较排序过后的字符串是否相同

部分相关知识回忆:

  1. string转slice:

    • []byte(s)
    • copy(dst []Type, src []Type)

    byte用rune替代也可以。byte是int8;rune是int32,用来表示unicode字符编码,索引一个字符

  2. sort函数

func Slice(x any, less func(i int, j int) bool).

时间复杂度O(nlog(n)),空间复杂度O(logn)

本题中使用的即为ascending order,在后面的函数中进行规则指定.

sort.slice必须传入slice,否则进行报错,所以对字符串需要进行转化

// 排序方法
func isAnagram(s string, t string) bool {
	//StringToSlice
	S := []rune(s)
	T := []rune(t)

	//进行排序
	sort.Slice(S, func(i, j int) bool {
		return S[i] < S[j]
	})
	sort.Slice(T, func(i, j int) bool {
		return T[i] < T[j]
	})

	//比较排序后字符串是否相同
	if string(S) == string(T) {
		return true
	}
	return false
}

文章来源:https://blog.csdn.net/kingsill/article/details/135441690
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。