是否有可能在使用按位操作的随机unicode字符串中找到重复字符?



我正在寻找在字符串中查找重复字符的解决方案,我对按位操作的解决方案感兴趣。

我发现了这样一个按位操作的变体。但是在它中,搜索发生在ASCII表的a-z范围内。

func HasDuplicates(str string) (string, bool) {
checker := 0
for _, char := range str {
val := char - 'a'
fmt.Println(val)
if (checker & (1 << val)) > 0 {
fmt.Printf("'%c' is Duplicaten", char)
return str, false
}
checker |= 1 << val
}
return str, true
}

是否有可能像上面的例子一样,只针对随机的unicode字符串(象形文字,表情符号等)制定一个通用的解决方案?

使用大号字体。Int作为bitset:

func HasDuplicates(str string) (string, bool) {
var bits big.Int
for _, char := range str {
val := int(char)
fmt.Println(val)
if bits.Bit(val) != 0 {
fmt.Printf("'%c' is Duplicaten", char)
return str, false
}
bits.SetBit(&bits, val, 1)
}
return str, true
}

https://go.dev/play/p/kS-OxYPts5G

这有多有效将取决于big。Int,你不能像在一个简单的整数上使用按位操作那样控制它。

你也可以使用布尔值的映射,尽管这样它就不再是位运算了:

func HasDuplicates(str string) (string, bool) {
var bits = make(map[int]bool)
for _, char := range str {
val := int(char)
fmt.Println(val)
if bits[val] {
fmt.Printf("'%c' is Duplicaten", char)
return str, false
}
bits[val] = true
}
return str, true
}

相关内容

  • 没有找到相关文章

最新更新