实现一个算法,确定一个字符串 s 的所有字符是否全都不同。
示例 1:
输入: s = "leetcode"
输出: false
示例 2:
输入: s = "abc"
输出: true
限制:
- 0 <= len(s) <= 100
- 如果你不使用额外的数据结构,会很加分。
- s 只包含小写字母
分析:
方法1:HashSet
用集合存储遍历到的字符,每次遍历判断是否和集合中的字符重复即可。
时间复杂度:O(n)
空间复杂度:O(n)
class Solution {
public boolean isUnique(String astr) {
//创建集合
HashSet<Character> set = new HashSet<>();
//遍历
for(char c: astr.toCharArray()){
//重复
if(set.contains(c)){
return false;
}
//添加
set.add(c);
}
return true;
}
}
方法2:数组
因为只包含小写字母,所以可以用长度为 26 的数组来存储。
时间复杂度:O(n)
空间复杂度:O(C) C 为 26
class Solution {
public boolean isUnique(String astr) {
//创建数组
int[] nums = new int[26];
//遍历
for(char c: astr.toCharArray()){
//索引
int index = c - 'a';
//重复
if(nums[index] > 0){
return false;
}
//计数
nums[index]++;
}
return true;
}
}
方法3:位运算
利用 int 整形的二进制有 32 位,因此可以用 26 位来存储每个字符是否出现。与运算的特点:0 & 1 = 1,1 & 1 = 1,当某一位重复时,与运算的结果就不为 0,返回 false。
时间复杂度:O(n)
空间复杂度:O(1)
class Solution {
public boolean isUnique(String astr) {
//创建整形
int num = 0;
//遍历
for(char c: astr.toCharArray()){
//将1移位到对应字符位置
int index = 1 << (c - 'a');
//重复
if((index & num) != 0){
return false;
}
//计数
num += index;
}
return true;
}
}
题目来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/is-unique-lcci