题目
Implement an algorithm to determine if a string has all unique characters. What if you can not use additional data structures?
用基本数据结构设计完成以下算法:判断一个字符串中的字符是否唯一。
思路
可以询问面试官字符集由什么组成,一般来讲考虑为ASCII码组成(即考虑共256个字符)。
解决思路一:
每一个字符对应一位,初始全置为0,第一次出现将该位置为1,依次判断字符串中的每一位,当再次出现结束循环即有重复字符出现。
优化思路二:
在思路一中需要用到长度为256个int类型来记录每一位的出现与否,其实一个int类型包括32位,我们只需要其中的每一位来记录就足够了,这样我们只需要256/32=8个int类型来记录。这样便节省了控件,不过我们需要用与“&”来做判断,用或“|”来做记录。
代码(C++)
#include<iostream>
#include<cstring>
using namespace std;
bool isUniquel1(string s) {
int a[256];
memset(a, 0, sizeof(a));
int len = s.length();
for(int i = 0; i < len; i++) {
int v = (int)s[i];
if(a[v]) return false;
else
a[v]=1;
}
return true;
}
bool isUniquel2(string s) {
int a[8];
memset(a, 0, sizeof(a));
int len = s.length();
for(int i = 0; i < len; i++) {
int v = (int)s[i];
int index = v/32;
int shift = v%32;
if(a[index] & 1<<shift) return false;
else
a[index] |= 1<<shift;
}
return true;
}
int main(){
string s1="jkZABHEJ";
string s2="jkZABHEJj";
printf("%d\n", isUniquel1(s1));
printf("%d\n", isUniquel1(s2));
printf("%d\n", isUniquel2(s1));
printf("%d\n", isUniquel2(s2));
return 0;
}