Leetcode 判断字符是否唯一

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

示例 1:

1
2
输入: s = "leetcode"
输出: false

示例 2:

1
2
输入: s = "abc"
输出: true

限制:

  • 0 <= len(s) <= 100
  • s[i]仅包含小写字母
  • 如果你不使用额外的数据结构,会很加分。
Related Topics
  • 位运算
  • 哈希表
  • 字符串
  • 排序
  • 👍 324

    👎 0

    ans:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    不适用数据结构 则使用位运算最合适


    分别是 (num & (1 << index)) != 0 以及 num |= (1 << index),读者可先看完代码,有不理解的再看下我重点讲解的两行代码。


    // 二进制数:1111 1111
    // 对应的每位的值: 128 64 32 16 8 4 2 1
    index 1 << index 解释
    0 0000 0001 << 0 1左移 0 位为 0000 0001 = 1
    1 0000 0001 << 1 1左移 1 位为 0000 0010 = 2
    2 0000 0001 << 2 1左移 2 位为 0000 0100 = 4
    3 0000 0001 << 3 1左移 3 位为 0000 1000 = 8
    ......
    7 0000 0001 << 7 1左移 7 位为 1000 0000 = 128


    研究 num & (1 << index)


    首先1 << index 由 一个 1 和多个 0 组成,num 是 int 型,假设 index = 1,即将 1 左移一位,此时 1 << index 为 ... 0000 0010,任何数 & 0 都为 0,所以num & (1 << 1)表示的是 num 化为二进制后的第二位与 1 << index 的第二位 & 的结果。
    假设 num 为 0, 则 (... 0000 0000 & ... 0000 0010) = 0,从哈希表的角度看就是 num 的第二位未被使用,假设位数对应26个小写字母,第二位为b,即hash中不存在b;

    假设 num 为 2,则 (... 0000 0010 & ... 0000 0010) = 2,从哈希表的角度看就是 num 的第二位已被使用,假设位数对应26个小写字母,第二位为b,即hash中已存在b;

    研究 num |= (1 << index)

    // 位的|(或)运算
    num | 1 << index
    0 | 1 = 1
    0000 0000 | 0000 0001 = 1

    1 | 1 = 1
    0000 0001 | 0000 0001 = 1

    2 | 1 = 3
    0000 0010 | 0000 0001 = 3


    当 num = 2 时,表明字母 b 已出现过,当 index = 01 << index 表示左移 0 位,对应字母 a,此时num |= (1 << index) 为 3,从哈希表的角度来看,此时 num 相当于已存在字母 a 和 b, 此时 num & (1 << 0) 为 1 不等于 0 ,表明字母 a 已经存在,返回false



    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    class soluaction{

    public boolean getResult(String str){
    int length = str.length();
    if(length > 26) return false;

    int num =0;
    for(int i=0;i< len ;i++){
    char c = str.charAt(i);
    int index = c -'a';
    if((num & 1 << index) !=0){
    // 存在重复数据
    return false;
    }else{

    num != 1 << index;
    }

    }
    return true;
    }


    }

    __END__