解法一
这个题大家一看觉得是不是很简单,我可以用一个整形数组来存数量啊,有不为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;
}
};