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

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


题目

实现一个算法,确定一个字符串 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
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大白吃饱了吗

请博主喝杯咖啡,有力继续码字!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值