题目链接
面试题 01.01. 判定字符是否唯一 - 力扣(LeetCode)
题目解析

判断整个字符串是不是有重复的字符
算法原理
法1 哈希表

法2 借助位图的思想
int 一共有32位, 我们只需要用26个比特位来表示小写字母, 0表示没出现, 1表示出现
查询某个比特位是不是1, 修改某个比特位为1

优化点: 鸽巢原理,26个英文字母, 如果字符串长度都>26,那么直接返回false
代码编写
法1
哈希表
class Solution {
public boolean isUnique(String astr) {
int[] hash = new int[26];
//把字符串转化为字符数组
char[] ch = astr.toCharArray();
//把字符数组对应下标放进hash
for(int i = 0;i< ch.length;i++){
char x = ch[i];
hash[x-97]++;
}
int flag = 0;
for(int i = 0;i< hash.length;i++){
if(hash[i] > 1){
flag = 1;
break;
}
}
if(flag == 1){
return false;
}
return true;
}
}
法2
位运算
class Solution {
public boolean isUnique(String astr) {
char[] ch = astr.toCharArray();// 转换位字符数组
//使用鸽巢原理进行优化
if(ch.length > 26){
return false;
}
// 使用比特位来解决
int a = 0;
// 获取字符对于int的比特位
for (char x : ch) {
int rs = 1 & (a >> (x - 97));
if (rs == 1) {
// 说明存在了重复的数
return false;
} else {
// 说明不存在
// 我们把第x位的数字改成1
a = a | (1 << (x - 97));
}
}
// 说明是不同的
return true;
}
}

2693

被折叠的 条评论
为什么被折叠?



