题目来源
题目描述
实现一个算法,确定一个字符串 s 的所有字符是否全都不同。
解答
位运算
由于题目提示可以不用额外的数据结构解题,那么我们应该抛弃直观上的用set解题的方法。双重循环的暴力求解由于O(n^2)的时间复杂度,也不应该考虑。
位运算方法的思路本质上,跟使用一个bool数组来记录astr的每一位是否已经出现过的思路是一样的。
基于bool数组的方法:
由于题目没有明确说明,根据示例我判断字符串中出现的字符应该在[‘a’,‘z’]之间,实践证明确实如此。基于这个前提,使用bool数组的做法是定义一个长度为26的初始值全为0 bool数组,逐个字符遍历astr,如果bool数组中对应的下标(‘a’->0, …, ‘z’->25)的值为1则重复出现,返回false,否则设置对应下标值为1。
基于位运算的方法
我们可以使用一个int类型的变量来代替长度为26的bool数组。
class Solution {
public:
bool isUnique(string astr) {
if(astr.size() > 26){
return false;
}
int check = 0;
for(char &ch : astr){
if(check & (1 << (ch - 'a'))){
return false;
}
check |= (1 <<(ch - 'a'));
}
return true;
}
};
解答
当最后一次索引的位置不是现在的位置就可以判断重复
public static boolean isUnique(String astr) {
for (int i = 0; i < astr.length(); i++){
char c = astr.charAt(i);
if (i != astr.lastIndexOf(c)){
return false;
}
}
return true;
}
解答
创建一个长度为255的数组,对应所有的字符的ASCII码,并遍历字符串的每一个字符,把相应的计数次数+1。
public static boolean isUnique(String astr) {
int [] arr = new int[256];
char [] crr = astr.toCharArray();
for (char c: crr){
if ( arr[(int)c] == 1){
return false;
}
arr[(int)c] ++;
}
return true;
}
public static boolean isUnique(String astr) {
int [] arr = new int[256];
for (int i = 0; i < astr.length(); i++){
int a = astr.charAt(i) - 'A';
if (arr[a] == 1){
return false;
}
arr[a] = 1;
}
return true;
}