我正在寻找一种在字符串中查找重复字符的解决方案,我对一种具有位操作的解决方案很感兴趣.

我发现这样一个具有位运算的变体.但在其中,搜索发生在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 Duplicate\n", char)
            return str, false
        }
        checker |= 1 << val
    }
    return str, true
}

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

推荐答案

big.Int用作位集:

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 Duplicate\n", 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 Duplicate\n", char)
            return str, false
        }
        bits[val] = true
    }
    return str, true
}

Go相关问答推荐

Golang regexpp:获取带有右括号的单词

Go在使用HTTP代理时如何处理DNS请求?

golang.org/x/oauth2 oauth2.Config.Endpoint.TokenURL mock:缺少access_token

如何使用 Go 连接到非默认 firestore 数据库?

将这两个函数合二为一的惯用方法

通过 Terraform 中的 MapNestedAtribute 进行迭代

Golang和Gin web框架在router.Run()之后执行代码

「GORM错误」不支持的数据类型:&[],不正确的模式

Caddy服务器try 打开端口80而不是8090.

命令行参数在 Golang 程序中不正确地接受为参数

如何使用名称具有包名称的嵌套 struct 启动 go struct

动态 SQL 集 Golang

CBC Decrypter 解密加密文本,但部分文本被随机字符替换

无法访问 Go 模块导入的远程存储库

为什么 0 big.Int 的 .Bytes() 值是空切片?

如何在 GORM 中迭代一个 int 数组

函数调用中的类型参数panic

如何在眼镜蛇(golang)中将标志作为参数传递?

使用不安全的指针从 [] 字符串中获取值

有没有办法在golang中映射一组对象?