面试题 01.01:判定字符是否唯一

简介: 面试题 01.01:判定字符是否唯一

题目

题目链接

实现一个算法,确定一个字符串 s 的所有字符是否全都不同。

示例 1:

输入: s = "leetcode"
输出: false 

示例 2:

输入: s = "abc"
输出: true

解题

方法一:哈希表

哈希表实现思路简单,但是使用了额外的数据结构。

class Solution {
public:
    bool isUnique(string astr) {
        unordered_set<int> set;
        for(char c:astr){
            if(set.count(c)){
                return false;
            }
            set.insert(c);
        }
        return true;
    }
};

方法二:位运算

实际上这个方法和哈希表差不多的思路,只不过实现的方法不一样。

经检查,字符范围是’a’~‘z’,因此可以使用下面的方法

参考链接

把字符串中每个字符转化为一个二进制数,转化方法为1向左N位的位运算,N为这个字符和字符‘a’的距离;

例如 Na = 0,Nb=1,Nc = 2…a = 1<<0 = 1 ,b = 1<<1 = 10, c = 1<<2 = 100…;

所以,每个字符串对应位置为1;

这种情况下,如果当前字符如果曾经出现过,也就是其中某一位对应位数的值为1,就意味着曾经出现,返回False;

否则,如果没有出现过,那么通过|或运算,把这一位的值改写为1;

例如 ‘abca’ : a= 1,b=10,c=100,前三次结果mark为111,最后一次111与001有相同符合条件,返回False

class Solution {
public:
    bool isUnique(string astr) {
        int mask=0;
        for(char c:astr){
            int moveBit=c-'a';
            if((mask&(1<<moveBit))!=0) return false;
            else{
                mask|=(1<<moveBit);
            }
        }
        return true;
    }
};
相关文章
|
1月前
面试题 08.08:有重复字符串的排列组合
面试题 08.08:有重复字符串的排列组合
31 0
|
8月前
|
算法 程序员
【Leetcode】NC31 第一个只出现一次的字符(牛客网)、面试题 01.01. 判定字符是否唯一
题目描述: 描述 在一个长为n字符串中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写).(从0开始计数)
43 0
|
8月前
|
程序员
【Leetcode】面试题 01.02. 判定是否互为字符重排、面试题 01.04. 回文排列
目录 面试题 01.02. 判定是否互为字符重排 面试题 01.04. 回文排列
41 0
|
1月前
|
机器学习/深度学习 Java
java字符串练习题3、字符串中字符是否相同判断
java字符串练习题3、字符串中字符是否相同判断
34 0
|
1月前
面试题 08.07:无重复字符串的排列组合
面试题 08.07:无重复字符串的排列组合
31 0
|
1月前
面试题 01.02:判定是否互为字符重排
面试题 01.02:判定是否互为字符重排
19 0
|
1月前
|
算法
六六力扣刷题字符串之找出字符串中第一个匹配项的下标
六六力扣刷题字符串之找出字符串中第一个匹配项的下标
42 0
|
1月前
|
Java Go
每日一题《剑指offer》字符串篇之字符流中第一个不重复的字符
每日一题《剑指offer》字符串篇之字符流中第一个不重复的字符
49 0
每日一题《剑指offer》字符串篇之字符流中第一个不重复的字符
【每日一题Day69】转换字符串的最少操作次数 |贪心
实现:遍历整个字符串,如果当前字符为’X’,那么进行转换,指针后移三位;如果当前字符为’O’,那么指针后移一位
67 0
LeetCode每日一题——面试题 01.02. 判定是否互为字符重排
给定两个字符串 s1 和 s2,请编写一个程序,确定其中一个字符串的字符重新排列后,能否变成另一个字符串。
89 0