判定字符是否唯一

在这里插入图片描述

解法一

这个题大家一看觉得是不是很简单,我可以用一个整形数组来存数量啊,有不为1的不就不唯一吗,再或者我弄一个set集合,每次插入元素再每次检测元素个数不就好了,无增加的话不就是不唯一的吗。这两种方法虽说可行,且时间复杂度不高,但是空间复杂度比较高。题目也说了,如果不使用额外的数据结构,会很加分,那么有同学会说,那我就用暴力啊,轮询的方法,那样的话时间复杂度会达到O(n2),这样子的话时间复杂度有太高了,所以在这我用一种时间复杂度和空间复杂度都不高的方法。

解法二

其实解法二的思路和整形数组的思路很像,虽说我们不用数组,但是我们也可用一个26位2进制的数来表示每一位的个数啊,如果是字符’a’,那么我们可以让二进制的第一位变为1,也就是说这个整形的26位2进制数位000000000000000000001,那有同学会说了,那我怎么表示其他的字母呢,我们可以运用到左移运算,假如说是’b’,我们就将1左移一位,'c’我们就将1左移两位,依此类推。每一次左移的数和之前得到的数进行 &运算,如果不为0,就说明有重复的位,那就说明字符不唯一。然后假如说为0,我们只需把之前得到的数和左移后的数进行 |运算得到下一次要判断的值即可。以下给出代码:

class Solution {
public:
    bool isUnique(string astr) {
        int temp = 0, a = 0;  //temp表示当时计算到的值, a表示要左移的位数
        for(const int i:astr){  //基于范围的for循环
            a = i-int('a');
            if(temp & (1<<a))  //&运算判断是否为0
                return false;
            temp |= (1<<a);  //|运算得到下一次运算需要的结果
        }
        return true;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值