如何判断两个字符串是否为换位字符串
题目
换位字符串是指组成字符串的字符相同,但位置不同。例如:由于字符串"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的数组进行统计。利用这个特性,可以在后面解决问题的时候多一个思路。