一、题目描述
实现一个算法,确定一个字符串 s 的所有字符是否全都不同。
二、题目解法
解法1:两层遍历
用两层遍历,时间复杂度O(n2),这也是最最容易想到的。
class Solution {
public boolean isUnique(String astr) {
//解法1、两层遍历
char[] chars = astr.toCharArray();
for(int i = 0 ; i < chars.length ; i++){
for(int j = i + 1 ; j < chars.length ; j++){
if(chars[i] == chars[j]){
return false;
}
}
}
return true;
}
}
解法2:HashSet
用HashSet,HashSet中有add方法,add返回值为boolean类型,若key值已经存在,即添加的元素已经存在,则会返回false,通过这个就可以判断是否唯一(HashSet底层还是HashMap)
class Solution {
public boolean isUnique(String astr) {
//解法2、HashSet
HashSet<Character> hashSet = new HashSet<>();
char[] chars = astr.toCharArray();
for(int i = 0 ; i < chars.length ;i++){
if(!hashSet.add(chars[i])){
//添加不成功,即重复,则返回false
return false;
}
}
return true;
}
}
解法3:HashMap
这个与上面HashSet基本相同,但是以后统计字符次数的都可以用这个思路
class Solution {
public boolean isUnique(String astr) {
//解法3:HashMap
HashMap<Character,Integer> hashMap = new HashMap<>();
char[] chars = astr.toCharArray();
for(char c : chars){
if(hashMap.containsKey(c)){
return false;//字符存在
}else{
hashMap.put(c,1);//添加并且出现次数设置为1
}
}
return true;
}
}
解法4:数组
class Solution {
public boolean isUnique(String astr) {
//解法4、数组
int[] nums = new int[26];
for (int i = 0; i < astr.length(); i++) {
nums[astr.charAt(i)-'a']++;
}
for (int num : nums) {
if (num > 1){
return false;
}
}
return true;
}
}
解法5:indexOf(本题最优)
出现索引不一样则重复,不唯一
class Solution{
public boolean isUnique(String astr) {
for (char ch: astr.toCharArray()){
if (astr.indexOf(ch) != astr.lastIndexOf(ch)) {
return false;
}
}
return true;
}
}