问题描述
请实现⼀个算法,确定⼀个字符串的所有字符是否全都不同。这⾥我们要求不允许使⽤额外的存储结构。
给定⼀个string,请返回⼀个bool值,true代表所有字符全都不同,false代表存在相同的字符。
保证字符串中的字符为ASCII字符。
字符串的⻓度⼩于等于3000。
解题思路
四点:
- ASCII字符。ASCII字符中,可打印字符范围为
32的空格到126的~,一共有95个字符。 - 全部不同。也就是字符串中的字符没有重复的。
- 不准使⽤额外的储存结构。
- 字符串⼩于等于3000。其实这条件没用,因为一共就95种可打印的ASCII字符,一个字符串长度超过95,那么必然有重复的字符,或者是存在非可打印字符。
由于不允许使用额外的储存结构,因此没有很好的低时间复杂度的算法,只能用比较暴力的方法去挨个搜索了。
完整代码
方法一
使用strings.Count()函数辅助:
string.Count()函数用于统计s中substr的非重叠实例数。
如果substr是空字符串,strings.Count返回s+1中的Unicode码点数。
func isUniqueString(s string) bool {
if strings.Count(s, "") > 95 {
return false
}
for _, v := range s {
if v < 32 || v > 126 {
return false
}
if strings.Count(s, string(v)) > 1 {
return false
}
}
return true
}
方法二
使用strings.LastIndex()函数辅助:
strings.LastIndex()返回s中substr的最后一个实例的索引。
如果s中不存在substr,则返回-1。
func isUniqueString(s string) bool {
if strings.Count(s, "") > 95 {
return false
}
for index, v := range s {
if v < 32 || v > 126 {
return false
}
if strings.LastIndex(s, string(v)) != index {
return false
}
}
return true
}