**问题描述**
请实现一个算法,确定一个字符串的所有字符【是否全都不同】。这里我们要求【不允许使用额外的存储结构】。 给定一个 string,请返回一个 bool 值,true 代表所有字符全都不同,false 代表存在相同的字符。 保证字符串中的字符为【ASCII 字符】。字符串的长度小于等于【3000】。
**解题思路**
这里有几个重点,第一个是`ASCII字符`,`ASCII字符`字符一共有 256 个,其中 128 个是常用字符,可以在键盘上输入。128 之后的是键盘上无法找到的。
然后是全部不同,也就是字符串中的字符没有重复的,再次,不准使用额外的储存结构,且字符串小于等于 3000。
如果允许其他额外储存结构,这个题目很好做。如果不允许的话,可以使用 golang 内置的方式实现。
**源码参考**
通过`strings.Count`函数判断:
~~~
func isUniqueString(s string) bool {
if strings.Count(s,"") > 3000{
return false
}
for _,v := range s {
if v > 127 {
return false
}
if strings.Count(s,string(v)) > 1 {
return false
}
}
return true
}
~~~
通过`strings.Index`和`strings.LastIndex`函数判断:
~~~
func isUniqueString2(s string) bool {
if strings.Count(s,"") > 3000{
return false
}
for k,v := range s {
if v > 127 {
return false
}
if strings.Index(s,string(v)) != k {
return false
}
}
return true
}
~~~
**源码解析**
以上两种方法都可以实现这个算法。
第一个方法使用的是 golang 内置方法`strings.Count`,可以用来判断在一个字符串中包含的另外一个字符串的数量。
第二个方法使用的是 golang 内置方法`strings.Index`和`strings.LastIndex`,用来判断指定字符串在另外一个字符串的索引未知,分别是第一次发现位置和最后发现位置。
- Golnag常见面试题目解析
- 交替打印数组和字母
- 判断字符串中字符是否全都不同
- 翻转字符串
- 判断两个给定的字符串排序后是否一致
- 字符串替换问题
- 机器人坐标计算
- 语法题目一
- 语法题目二
- goroutine和channel使用一
- 实现阻塞读的并发安全Map
- 定时与 panic 恢复
- 高并发下的锁与map读写问题
- 为 sync.WaitGroup 中Wait函数支持 WaitTimeout 功能.
- 七道语法找错题目
- golang 并发题目测试
- 记一道字节跳动的算法面试题
- 多协程查询切片问题
- 对已经关闭的的chan进行读写,会怎么样?为什么?
- 简单聊聊内存逃逸?
- 字符串转成byte数组,会发生内存拷贝吗?
- http包的内存泄漏