问题描述:
请实现⼀个算法,确定⼀个字符串的所有字符【是否全都不同】。这⾥我们要求【不允许使⽤额外的存储结构】。给定⼀个string,请返回⼀个bool值, true代表所有字符全都不同,false代表存在相同的字符。
保证字符串中的字符为【ASCII字符】。字符串的⻓度⼩于等于【3000】。
解题思路:
这⾥有⼏个重点,第⼀个是 ASCII字符 , ASCII字符⼀共有256个,其中128个是常⽤字符,可以在键盘上输⼊。128之后的是键盘上⽆法找到的。
然后是全部不同,也就是字符串中的字符没有重复的,再次,不准使⽤额外的储存结构,且字符串⼩于等于3000。如果允许其他额外储存结构,这个题⽬很好做。如果不允许的话,可以使⽤golang内置的⽅式实现。
源码参考:
通过 strings.Count 函数判断:
package main
import (
"fmt"
"strings"
)
func isUniqueString(s string) bool {
// 先判断长度,如果大于3000,直接返回false
if strings.Count(s, "") > 3000 {
return false
}
// 判断字符是否在ASCII范围内
for _, v := range s {
// 如果不在,直接返回false
if v > 127 {
return false
}
// 如果在,判断是否重复
if strings.Count(s, string(v)) > 1 {
return false
}
}
return true
}
func main() {
// 调用 isUniqueString 函数
fmt.Println(isUniqueString("abc"))
fmt.Println(isUniqueString("abca"))
fmt.Println(isUniqueString("abcdefghijklmnopqrstuvwxyz"))
fmt.Println(isUniqueString("abcdefghijklmnopqrstuvwxyza"))
}
通过 strings.Index 和 strings.LastIndex 函数判断:
func isUniqueString2(s string) bool {
// 先判断长度,如果大于3000,直接返回false
if strings.Count(s, "") > 3000 {
return false
}
for k, v := range s {
// 如果不在,直接返回false
if v > 127 {
return false
}
// 如果在,判断是否重复
if strings.Index(s, string(v)) != k {
return false
}
}
return true
}
一些值得讨论的细节:
strings.Count 使用:
在Go语言中,strings.Count(s, "") 函数用于计算字符串 s 中字符的个数。这里的两个参数分别是:
- s:要计算字符个数的字符串。
- "":一个空字符串,表示要计算的是 s 中所有字符的个数,包括空格和其他不可见字符。
这个函数的工作原理是,它会遍历字符串 s,并统计遇到的字符个数。由于空字符串 "" 可以匹配字符串中的任何位置,所以 strings.Count(s, "") 实际上是在计算字符串 s 的长度。
例如,如果你有一个字符串 s 为 "hello world",那么 strings.Count(s, "") 的结果将是 11,因为这个字符串中总共有 11 个字符,包括空格。
strings.Index 使用:
strings.Index 是 Go 语言标准库中 strings 包的一个函数,用于在一个字符串中查找另一个字符串第一次出现的位置。如果找到了,则返回该位置的索引;如果没有找到,则返回 -1。
函数签名如下:
func Index(s, substr string) int
参数说明:
- s:要搜索的字符串。
- substr:要查找的子字符串。
返回值:
- 如果找到了子字符串,则返回子字符串在字符串中第一次出现的索引。
- 如果没有找到子字符串,则返回 -1
例如:
s := "hello world"
index := strings.Index(s, "world")
fmt.Println(index) // 输出: 6
在这个例子中,strings.Index(s, "world") 在字符串 "hello world" 中查找 "world" 第一次出现的位置,并返回其索引 6。