题目
实现一个算法,确定一个字符串 s 的所有字符是否全都不同。
PS:如果你不使用额外的数据结构,会很加分。
思路
先不考虑不使用额外的数据结构的,开一个长度为26的数组来记录下对应的个数,一旦出现了记录个数大于1的直接返回false。
代码
class Solution {
public boolean isUnique(String astr) {
int record[]=new int[26];
int length=astr.length();
for (int i=0;i<length;++i)
{
record[astr.charAt(i)-97]++;
if (record[astr.charAt(i)-97]>1)
return false;
}
return true;
}
}
结果
使用了额外的数据结构,如果能相处一种直接不用额外的数据结构的,那就更好了。
改进思路
因为只有26个小写子母,我们可以利用一个0【二进制形式的】,记为result,这个时候,总共32位全部都是0。我们每次取出一个字符,并将它转化为一个整数,记为temp,比如,a转化为1,b转化为2.
然后,我们求出这个数对应的二进制数,比如1,对应的二进制数就是00000000…01; 十进制2对应的就是 00000…00010, 十进制3 对应的就是 00000…00100.依次类推,记为num。
我们先利用 num 和 result 去进行按位与运算,这样子,得出来的结果,如果大于0,表明原来的位置上已经有1了,那么这个字符出现重复,返回 false。
否则,利用 num 和 result 进行按位或运算并且赋值给result,这样子,就把1加到result里面了。就可以继续下一个字符的循环了。不用用到额外的数据结构。
改进的代码
class Solution {
public boolean isUnique(String astr) {
int result=0;
int length=astr.length();
for (int i=0;i<length;++i)
{
int temp=(astr.charAt(i)-96); //字符转化为数字, a 对应 1, b对应2.
int num=1;
while (temp>1) //把对应的数变为一个对应的二进制数,在对应位置变为1
{
num=num<<1;
--temp;
}
if ((result&num)>0) //原来位置为1 ,进行位运算后结果才大于0
return false;
else
{
result|=num;//把对应位置的1 给补上结果
}
}
return true;
}
}
结果
虽然只比上面一种解法少了一点点内存,但是面试的时候,如果能写出这种解法,那会加分的。