实现一个算法,确定一个字符串 s 的所有字符是否全都不同。
示例 1:
输入: s = “leetcode”
输出: false
示例 2:
输入: s = “abc”
输出: true
这个题目最容易想到的就是先排序,再利用一次循环判断前后元素是否相等就能实现。时间复杂度最少是o(nlogn);
还可以用set去重或者unordered_map的键值对来实现线性复杂度。不过需要额外的空间;一个小点,键值对的值如果是int,初始化默认为0,不用赋值了;
最不容易想到的就是位运算了,设置一个int 0为标准元素。每次让一个字符和a的差值和0按位或,这时一个位如果是1就是这个字母存在,再进行一个按位与操作,如果出现两次,按位与的结果肯定是1,就可以返回false了。
class Solution {
public:
bool isUnique(string astr) {
// int n=astr.length();
// if(n==0)
// return true;
// unordered_set<char> tmp;
// for(int i=0;i<n;i++)
// {
// tmp.emplace(astr[i]);
// }
// int m=tmp.size();
// if(m==n)
// return true;
// else
// return false;
//
// unordered_map<char,int> hash;//value默认为0
// int n=astr.length();
// int flag=1;
// if(n==0)
// return true;
// for(int i=0;i<n;i++)
// {
// hash[astr[i]]+=1;
// }
// for(auto iter=hash.begin();iter!=hash.end();iter++)
// {
// if(iter->second>1)
// {
// flag=0;
// break;
// }
// }
// if(flag==1)
// return true;
// else
// return false;
///
int cnn=0;
int n=astr.size();
if(n==0)
return true;
for(int i=0;i<n;i++)
{
if(cnn&(1<<(astr[i]-'a')))
return false;
cnn=cnn|(1<<(astr[i]-'a'));
}
return true;
}
};
但是要注意,int只有32位,所以只能判断32种字符,这题测试用例都是小写字母,所以可以通过,如果存在其他特殊字符就不一定了,至少要128位的才可以,所以巧妙的方法不是任何情况都适用的。