更多、更体系化的内容请持续关注 《菜鸟程序员成长计划》之数据结构与算法 专栏,您的 关注、点赞、收藏 都将是小编持续创作的动力!
题目
实现一个算法,确定一个字符串 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
参考:本篇内容参考自开源社区,感谢前人的经验和付出,让我们可以有机会站在巨人的肩膀上眺望星辰大海。