题目描述:
实现一个算法,确定一个字符串 s 的所有字符是否全都不同。
示例 1:
输入: s = "leetcode"
输出: false
示例 2:
输入: s = "abc"
输出: true
限制:
0 <= len(s) <= 100
如果你不使用额外的数据结构,会很加分。
解题思路
1.暴力法 时间换空间
看到题目第一想法便是使用二重循环来判断是否存在重复元素,外循环i记录当前位置,内循环j查看i右侧元素astr[j]是否存在与astr[i]相同元素。若有重复,则返回false;若结束二重循环时,i==astr.size(),表明数组中无重复元素。返回true。
class Solution {
public:
bool isUnique(string astr) {
int i=0,n=astr.size();
while(i<n-1){
int j=i+1;
while(astr[i]!=astr[j]&&j!=n-1)
j++;
if(j!=n-1||astr[i]==astr[j])
return false;
else
i++;
}
return true;
}
};
时/空复杂度
时间复杂度:双重循环,。
空间复杂度:没有使用辅助空间,O(1)。
2.哈希表,空间换时间
在内存中开辟空间来存放出现过的元素值,随着数组的遍历,不断检查哈希表中是否已有该元素,若未曾出现,则插入哈希表;否则返回false。
class Solution {
public:
bool isUnique(string astr) {
int n=astr.size();
unordered_set<char> occured(astr[0]);
for(int i=0;i<n;i++){
if(!occured.count(astr[i]))
occured.insert(astr[i]);
else
return false;
}
return true;
}
};
时/空复杂度
时间复杂度:仅需一次遍历,O(N)。
空间复杂度:使用辅助空间,O(N)。