刷题--程序员面试金典--面试题 01.01. 判定字符是否唯一(go)

面试题 01.01. 判定字符是否唯一

实现一个算法,确定一个字符串 s 的所有字符是否全都不同。

示例 1:

输入: s = "leetcode"
输出: false 
示例 2:

输入: s = "abc"
输出: true
限制:

0 <= len(s) <= 100
如果你不使用额外的数据结构,会很加分。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/is-unique-lcci
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。


方法一:

数组额外存储:

func isUnique(astr string) bool {
    c := make([]int,26)

    a := []byte(astr)

    for _,v := range a {
        if c[v-'a'] > 0 {
            return false
        }
        c[v-'a']++
    }

    return true
}

方法二:

位运算

思路:

num可以看作一个26位的二进制数(相当于将方法一的数组存储在了num中),每遍历到其中的一个字母,位移量相当于:v-'a',

1<

num & (1<<(v-'a')), 位与操作进行两数比较,若不为0则表示有重复的字符。

num |= 1<<(v-'a'),位或操作,相当于让num中的第v-'a'位置1.

示例分析:

astr="abc"

num初始化位0

step1:v = 'a',v-'a' = 0即:1<<(v-'a') = 1 所以,num & (1<<(v-'a')) == 0,然后进行位或运算,0 | 1 = 1,所以此时num = 1

step2:v='b',v-'a' = 1,即:1<<1 = 10 = 2,所以 01 & 10 == 01 != 0,然后位或,01 | 11 = 11(第v-'a'位置1)

step3:v = 'c',v-'a' = 2.即: 1<<2 = 100 = 4,所以11 & 100 == 100 != 0 ,然后位或,11 | 100 = 111 (第v-'a' 位置1)

最后返回true.

若astr="abb",则

在step3:v='b',v-'a' = 1,即:1<<1 = 2,所以11 & 10 == 10 == 2 != 0,即返回false

func isUnique(astr string) bool {
    num := 0
    ac := []byte(astr)

    for _,v := range ac {
        if num & (1<<(v-'a')) != 0 {
            return false
        }
        num |= 1<<(v-'a')
    }

    return true
}

 

你可能感兴趣的:(刷题,刷题--程序员面试金典)