面试题 01.01. 判定字符是否唯一
面试题 01.01. 判定字符是否唯一
方法1:排序
思路
- 首先利用STL中的sort函数对字符串s进行排序,字符串的字符按照字符的ASCII码大小升序排列,相同字符紧挨在一起。
- 判断相邻字母astr[i-1]和astr[i]是否相等,其中i>=0。如果astr[i-1]=astr[i],说明字符串s中存在相同字符,返回false。
- 如果遍历完整个字符串s都没有发现相同字符,返回true。
代码
/**
1.时间复杂度:O(nlogn)
2.空间复杂度:O(1)
**/
class Solution {
public:
bool isUnique(string astr) {
// 对字符串进行升序排列
sort(astr.begin(), astr.end());
// 遍历字符串s中的每个字符
for(int i = 1; i < astr.size(); i++){
// 如果存在相等的相邻字符,返回false
if(astr[i] == astr[i - 1]){
return false;
}
}
// 如果不存在相等的相邻字符,返回true
return true;
}
};
复杂度分析
- 时间复杂度:\(O(nlogn)\)。sort函数使用的是类似快速排序的算法,平均时间复杂度为\(O(nlogn)\)。遍历字符串判断所需的时间复杂度为\(O(n)\)。故而算法的整体时间复杂度为\(O(nlogn)\)。
- 空间复杂度:\(O(1)\)。除了字符串astr之外没有开辟新的内存空间。
方法2:位运算
思路
在假设字符串只由小写字母和大写字母组成的情况下,可以使用一个long类型(长整型)数字mask来记录已经出现的字符,mask的每一位对应一个字符。如下图所示:
第1位对应A,第2位对应B,第3位对应C,第4位对应D,后面的位按照字符的ASCII码大小依次对应。
然后再遍历字符串中的字符,先判断对应的位置是否是1,如果是1,就表示已经存在了,直接返回false,如果对应的位置不是1,说明这个字符还没出现过,然后把对应的位置置为1。
代码
/**
1.时间复杂度:O(n)
2.空间复杂度:O(1)
**/
class Solution {
public:
bool isUnique(string astr) {
long mask = 0;
for(char c : astr){
int dif = c - 'A';
if((mask & (1L << dif)) != 0){
return false;
}else{
mask |= (1L << dif);
}
}
return true;
}
};
复杂度分析
- 时间复杂度:\(O(n)\)。
- 空间复杂度:\(O(1)\)。除了字符串astr之外没有开辟新的内存空间。