【LeetCode刷题记录】8.判定字符是否唯一

122 阅读1分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

一、题目描述:

题目来源:LeetCode-判定字符是否唯一

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

示例 1:

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

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

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

二、思路分析:

思路一:

  1. 首先给的是字符串,字符串可以转为字符数组,方便存入集合中,字符数组的长度即是字符串的长度。
  2. 使用HashSet,Hashet的特点是不可重复、可以为空,字符串转换为字符数组后,放入Set集合中。
  3. 全部数据放入集合中后,比较集合以及原来字符串的长度、或者和字符数组长度比较。
  4. 如果字符数组长度==集合大小 必然没有重复。反之。

思路二:

  1. 使用ASCII码与位运算的方式求解
  2. ASCII码字符个数为128个
  3. 以使用两个64位的long变量来存储是否出现某个字符
  4. 二进制位1表示出现过, 0表示未出现过

三、AC 代码:

思路一:

class Solution {
    public boolean isUnique(String astr) {
        char[] chars = astr.toCharArray();
        HashSet<Character> characters = new HashSet<>();
        for (int i = 0; i < chars.length; i++) {
            characters.add(chars[i]);
        }
        if (characters.size() == chars.length) {
            return true;
        }
        return false;

    }
}

思路二:

class Solution {
    public boolean isUnique(String astr) {
        long low64 = 0;
        long high64 = 0;
    
        for (char c : astr.toCharArray()) {
            if (c >= 64) {
                long bitIndex = 1L << (c - 64);
                if ((high64 & bitIndex) != 0) {
                    return false;
                }
    
                high64 |= bitIndex;
            } else {
                long bitIndex = 1L << c;
                if ((low64 & bitIndex) != 0) {
                    return false;
                }
    
                low64 |= bitIndex;
            }
    
        }
        return true;
    }
}

四、总结:

  1. 如果上来直接写个二重循环搞定,可能只能得到50分
  2. 多种思路有多重考虑情况,例如:ascii字符集需要有边界检查,并且针对不同的范围有不同的侧重点,比如说ascii字符集,那也就是128个可能性。
  3. 有些东西一开始没想到不是问题,工作中提示一下即可,但是思维对我们来说更重要。