「 数据结构与算法 」判定字符是否唯一

95 阅读1分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 2 天,点击查看活动详情


更多、更体系化的内容请持续关注 《菜鸟程序员成长计划》之数据结构与算法 专栏,您的 关注、点赞、收藏 都将是小编持续创作的动力!


题目

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

示例 1:

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

示例 2:

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

限制:

  • 0 <= len(s) <= 100
  • s[i]仅包含小写字母
  • 如果你不使用额外的数据结构,会很加分。

解题

方法一

一、方法描述

根据提示散列表 HashMap(特性为不允许有重复的主键),泛型设置<Character,Integer>,

HashMap常用方法:

​ 1、put(K,V) 向集合添加元素 ​ 2、size()获取集合长度

我的解题思路:

​ 设置计数器,初始值0,添加一次则++自增。HashMap的put方法遇见重复的K时,会覆盖掉之前的(K,V)。所以,当重复添加就有覆盖,HashMap的长度就会比原字符串的长度

class Solution {
    public boolean isUnique(String astr) {
        boolean flag = true;
        int cnt = 0;
        HashMap<Character,Integer> mh = new HashMap<Character,Integer>();
        for(int i = 0;i <astr.length();i++){
            char ch = astr.charAt(i);
            mh.put(ch,++cnt);
        }
        if(mh.size()<astr.length()){
            flag = false;
        }
        return flag;
    }
}

二、执行结果

执行结果: 通过

执行用时:0 ms

内存消耗:39.4 MB


方式二

一、方法描述

​ 利用哈希集合HashSet,要是集合里没有这个数的时候就插入这个元素,要是有这个元素的时候就会在add的时候出错,然后就会返回false

class Solution {
	public boolean isUnique(String astr){
        int n = astr.length();
        if (n == 0 || n == 1){
            return true;
        }
        HashSet<Character> set = new HashSet<>();
        for (char c : astr.toCharArray()){
            if (!set.add(c)){
                return false;
            }
        }
        return true;
    }
}

二、执行结果

执行结果: 通过

执行用时:0 ms

内存消耗:39.4 MB


方式三

一、方法描述

​ 通过一个位运算的方法,java里的int型有32位已经足够了,这里通过一个int的变量作为一个flag。首先当出现的时候就是把这个flag里的0变成1,要是再出现的话的通过位运算发现这个位置变成了1了,那么就返回一个false

//写法1
class Solution {
	 public boolean isUnique(String astr){
        int n = astr.length();
        if (n == 0 || n == 1){
            return true;
        }
        int memory = 0;
        char[] charArr = astr.toCharArray();
        for (char c : charArr){
            if ((memory & 1 << (c -'a')) != 0){
                return false;
            }else {
                memory |= 1 << (c - 'a');
            }
        }
        return true;
    }
}

//写法2
class Solution {
    public boolean isUnique(String astr) {
        // 不使用额外的数据结构
        int mark = 0;
        for (int i = 0; i < astr.length(); i++) {
            int moveBit = astr.charAt(i) - 'a';
            if ((mark & (1 << moveBit)) != 0) return false;
            mark |= 1 << moveBit;
        }
        return true;
    }
}

二、执行结果

执行结果: 通过

执行用时:0 ms

内存消耗:39.4 MB


方式四

一、方法描述

​ 使用char数组,先排序,然后遍历判断前后元素是否相等

class Solution {
    public boolean isUnique(String astr) {
        char[] arr = astr.toCharArray();
        Arrays.sort(arr);
        for (int i = 1; i < arr.length; i++) {
            if (arr[i] == arr[i - 1]) return false;
        }
        return true;
    }
}

二、执行结果

执行结果: 通过

执行用时:0 ms

内存消耗:39.1 MB


方式五

一、方法描述

class Solution {
    public static boolean isUnique(String astr) {
        return astr.chars().distinct().count() == astr.length();
    }
}

二、执行结果

执行结果: 通过

执行用时:1 ms

内存消耗:39.4 MB


参考:本篇内容参考自开源社区,感谢前人的经验和付出,让我们可以有机会站在巨人的肩膀上眺望星辰大海。

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 2 天,点击查看活动详情