判定字符是否唯一
实现一个算法,确定一个字符串 s s s 的所有字符是否全都不同。
示例 1:
输入: s = “leetcode”
输出: false
示例 2:
输入: s = “abc”
输出: true
限制:
0 <= len(s) <= 100
s[i]仅包含小写字母
如果你不使用额外的数据结构,会很加分。
题解1:
如果长度超过26,那么至少有一个字母出现过至少两次,直接判
false
即可。
最简单也最快想到的就是暴力,双循环, O ( n 2 ) O(n^2) O(n2)
C++
class Solution {
public:bool isUnique(string astr) {if(astr.size()>26)return false;for(int i=0;i<astr.size();i++)for(int j=i+1;j<astr.size();j++)if(astr[i]==astr[j])return false;return true;}
};
C
bool isUnique(char* astr){if(strlen(astr)>26)return false;for(int i=0;i<strlen(astr);i++)for(int j=i+1;j<strlen(astr);j++)if(astr[i]==astr[j])return false;return true;
}
题解2:
使用额外的布尔数组,记录是否出现过。时间复杂度 O ( n ) O(n) O(n),但空间复杂度增加了
C++
class Solution {
public:bool isUnique(string astr) {if(astr.size()>26)return false;bool b[26]={false};for(int i=0;i<astr.size();i++){if(b[astr[i]-'a'])return false;b[astr[i]-'a']=true;}return true;}
};
C
bool isUnique(char* astr){if(strlen(astr)>26)return false;bool b[26]={false};for(int i=0;i<strlen(astr);i++){if(b[astr[i]-'a'])return false;b[astr[i]-'a']=true;}return true;
}
题解3:
使用位运算,本来以为不用用任何额外的空间的,但没想出来。
看了一下题解,其实就是用int取代bool数组,但空间需求 2 16 2^{16} 216
C++
class Solution {
public:bool isUnique(string astr) {if(astr.size()>26)return false;int mark=0;for(int i=0;i<astr.size();i++){if(mark&(1<<(astr[i]-'a')))return false;else mark |= (1<<(astr[i]-'a'));}return true;}
};
C
bool isUnique(char* astr){if(strlen(astr)>26)return false;int mark=0;for(int i=0;i<strlen(astr);i++){if(mark&(1<<(astr[i]-'a')))return false;else mark |= (1<<(astr[i]-'a'));}return true;
}
题解4:
使用string的函数,找有没有相同的
class Solution {
public:bool isUnique(string astr) {if(astr.size()>26)return false;for(int i=0;i<astr.size();i++)if(astr.rfind(astr[i])!=i)return false;return true;}
};
题解5:
使用set代替bool数组,利用insert函数的返回值判断
class Solution {
public:bool isUnique(string astr) {if(astr.size()>26)return false;set<int>s;for(int i=0;i<astr.size();i++)if(s.insert(astr[i]).second==false)return false;return true;}
};