如何判断两个字符串是否为换位字符串

如何判断两个字符串是否为换位字符串


题目

换位字符串是指组成字符串的字符相同,但位置不同。例如:由于字符串"aaaabbc"与字符串“abcbaaa”就是由相同的字符所组成的。因此,他们是换位符。

hash统计法

顾名思义将字母hash到一个key上,然后通过计数去最后比较。由于一个字母就可以当key,所以直接使用key为uint8(因为直接通过string下标取,取的是字母的ASCII码),value为int的map即可。通过遍历字符串,然后通过统计的加减,最后通过遍历map,看是否有不为0的count,如果有就代表两个字符串不是换位符。

时间复杂度:O(n)

空间复杂度:O(n)

func charCompare(a,b string) bool {
    if len(a) != len(b) {
		return false
	}

	if len(a) == 1 && len(b) == 1 {
		if a[0] != b[0] {
			return false
		}

		return true
	}
	var (
		charCountMap = make(map[uint8]int, 0)
	)

	for i := 0; i < len(a); i++ {
		charCountMap[a[i]]++
		charCountMap[b[i]]--
	}

	for _, v := range charCountMap {
		if v != 0 {
			return false
		}
	}

	return true
}

数组对位法

在上面的方法已经提到了遍历字符串,取下标对应的字符时,是取到对应字符的ASCII,所以可以利用这个特性,宣告一个长度为256的array。遍历字符串时,直接通过对ASCII的count加减。再利用Go array可以直接比对的特性,和[256]int{}初始状态比较一下就行

时间复杂度:O(n)

空间复杂度:O(n),n=256

func charCompareByArray(a, b string) bool {
	if len(a) != len(b) {
		return false
	}

	if len(a) == 1 && len(b) == 1 {
		if a[0] != b[0] {
			return false
		}

		return true
	}
	var (
		charArray = [256]int{}
	)

	for i := 0; i < len(a); i++ {
		charArray[a[i]]++
		charArray[b[i]]--
	}

	if charArray == [256]int{} {
		return true
	} else {
		return false
	}
}

这题原本是3个for,一个for在统计a的字符数量,然后再一个for去遍历b,减对应位置的统计数量,最后一个for遍历这个charArray判断是否不为0的字符。

通过优化之后减少了两个for:

  • 加减其实可以同时进行
  • Go可以允许数组比较

总结

这题其实不难,主要是利用ASCII对应array index的一个思路,利用一个长度为256的数组进行统计。利用这个特性,可以在后面解决问题的时候多一个思路。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值