Go语言面试:判断字符串中字符是否全都不同

526 阅读1分钟

问题描述

请实现⼀个算法,确定⼀个字符串的所有字符是否全都不同。这⾥我们要求不允许使⽤额外的存储结构

给定⼀个string,请返回⼀个bool值,true代表所有字符全都不同,false代表存在相同的字符。

保证字符串中的字符为ASCII字符

字符串的⻓度⼩于等于3000

解题思路

四点:

  1. ASCII字符。ASCII字符中,可打印字符范围为32的空格到126~,一共有95个字符。
  2. 全部不同。也就是字符串中的字符没有重复的。
  3. 不准使⽤额外的储存结构。
  4. 字符串⼩于等于3000。其实这条件没用,因为一共就95种可打印的ASCII字符,一个字符串长度超过95,那么必然有重复的字符,或者是存在非可打印字符。

由于不允许使用额外的储存结构,因此没有很好的低时间复杂度的算法,只能用比较暴力的方法去挨个搜索了。

完整代码

方法一

使用strings.Count()函数辅助:

string.Count()函数用于统计ssubstr的非重叠实例数。

如果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()返回ssubstr的最后一个实例的索引。

如果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
}