每日一题--判断一个字符串中的字符是否唯一(Cracking the Coding Interview)

题目
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;
}

猜你喜欢

转载自blog.csdn.net/weixin_39860046/article/details/87643289