LeetCode:判断字符串s和t是否为同字母异序

本文介绍了如何使用Go语言实现四个不同的方法来判断两个字符串是否为异位词,包括哈希映射、打表、字母计数和排序。这些方法分别通过检查字符出现次数、更新计数表、使用字母数组以及排序字符串来判断输入字符串s和t是否互为异位词。此外,还讨论了如何处理包含Unicode字符的情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Given two strings and t,write a function to determine if it is an anagram of s.

Example 1:
Input:s="anagram",t="nagaram"
Output:true

Example 2:
Input:s="rat",t="car"
Output:false

Follow up:
What if the inputs contain unicode characters?How would you adapt your solution to such case?

题目大意:
给出2个字符串s和t,如果t中的字母在s中都存在(同字母异位),输出true,否则输出false.

解题思路:
方法1:
可以利用哈希进行key-value存储,key存储单个字符,value存储字符个数.这道题需要注意字符串相同也属于anagram,比如"car"和它
本身,空字符串也算是.优化可以利用一个map遍历即可.

方法2:
可以用打表的方式做.先把s中的每个字母都存在一个26容量的数组里面,每个下标依次对应26个字母.s中每个字母都对应表中一个字母,每出现
一次就进行+1.然后再扫描字符串t,每出现一次字母就进行-1.最终表中的值肯定为0.

方法3:
对s,t进行排序

Go语言实现

package main

import "fmt"

func isAnagramOne(s string,t string)bool{
	if len(s)!=len(t){
		return false
	}
	res,ans:=map[byte]int{},map[byte]int{}//make(map[byte]int)初始化
	for _,c:=range s{
		res[byte(c)]++;
	}
	for _,c:=range t{
		ans[byte(c)]++;
	}
	for k:=range ans{
		if ans[k]!=res[k]{
			return false
		}
	}
	return true
}

func isAnagramTwo(s,t string) bool{
	if len(s)!=len(t){
		return false
	}
	ans:=make(map[byte]int)
	for _,c:=range s{
		ans[byte(c)]++;
	}
	for _,c:=range t{
		if ans[byte(c)]!=0{
			ans[byte(c)]--
		}
	}
	for _,v:=range ans{
		if v!=0{
			return false
		}
	}
	return true
}

func isAnagramThree(s,t string) bool{
	if len(s)!=len(t){
		return false
	}
	alphabet:=make([]int,26)
	sBytes,tBytes:=[]byte(s),[]byte(t)
	for i:=0;i<len(sBytes);i++{
		alphabet[sBytes[i]-'a']++
	}
	for i:=0;i<len(tBytes);i++{
		alphabet[tBytes[i]-'a']--
	}
	for i:=0;i<len(alphabet);i++{
		if alphabet[i]!=0{
			return false
		}
	}
	return true
}

func isAnagramTFour(s,t string) bool{
	if len(s)!=len(t){
		return false
	}
	sBytes,tBytes:=[]byte(s),[]byte(t)
	quickSortByte(sBytes,0,len(sBytes)-1)
	quickSortByte(tBytes,0,len(tBytes)-1)

	for i:=0;i<len(sBytes);i++{
		if sBytes[i]!=tBytes[i]{
			return false
		}
	}
	return true
}

func quickSortByte(a []byte,lo,hi int){
	if lo>=hi{
		return
	}
	k:=partionByte(a,lo,hi)
	quickSortByte(a,lo,k-1)
	quickSortByte(a,k+1,hi)
}

func partionByte(a []byte,lo,hi int)int{
	pivot,i:=a[hi],lo-1
	for j:=lo;j<hi;j++{
		if a[j]>pivot{
			i++
			a[j],a[i]=a[i],a[j]
		}
	}
	a[i+1],a[hi]=a[hi],a[i+1]
	return i+1
}
func main(){
	s,t:="anagram","nagaram"
	fmt.Println(isAnagramOne(s,t))
	fmt.Println(isAnagramTwo(s,t))
	fmt.Println(isAnagramThree(s,t))
	fmt.Println(isAnagramTFour(s,t))
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

路上的追梦人

您的鼓励就是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值