程序员面试金典: 9.1数组与字符串 1判断字符串所有字符全都不同

#include 
#include 
#include 

using namespace std;

const int MAXSIZE = 256;


/*
问题:实现算法,确定字符串所有字符是否全都不同
思路:假设为ASCII字符,那么最多256个,如果字符串长度大于256,必定重复,
如果<=256个字符,那么设定一个布尔数组,初始化该数组每个元素为否,表明没有
重复出现,如果某字符首次出现,则设定为true,如果某字符对应已经为true,则
直接返回

输入:
chaoyan
zhuwenpi
输出:
repeated
different

关键:
1 大于256个字符,必定重复
2 设定一个布尔数组,初始化该数组每个元素为否,表明没有
重复出现,如果某字符首次出现,则设定为true,如果某字符对应已经为true,说明重复
3 考虑如果字母仅为'a'到'z',则一个int包含32位,则可以采用“&”的方式做,减去‘a’
  相与后大于0,说明重复
*/
bool isRepeated(string str)
{
	//为空必定不重复
	if(str.empty())
	{
		return false;
	}
	int length = str.size();
	if(length > 256)
	{
		return true;
	}
	int flags[MAXSIZE];
	memset(flags , 0 , sizeof(flags) );
	for(int i = 0; i < length ; i++)
	{
		int ch = str[i];
		//如果之前已经出现过了,那么说明重复
		if( 1 == flags[ch] )
		{
			return true;
		}
		//之前没有出现过
		else if(0 == flags[ch])
		{
			flags[ch] = 1;
		}
	}

	//如果之前一直都没有重复,走到这里说明也没有重复
	return false;
}

//假设只有'a'~'z' 26个字母,而一个int包含32位,则可以采用“&”的方式做
bool isRepeated_aToZ(string str)
{
	//为空必定不重复
	if(str.empty())
	{
		return false;
	}
	int length = str.size();
	if(length > 256)
	{
		return true;
	}
	int checker = 0;
	for(int i = 0 ; i < length ; i++)
	{
		//注意要减去字符
		int ch = str[i] - 'a';
		int res = checker & (1 << ch);

		//说明该字母已经出现过,这里不是1,应该是大于0,因为不一定在1上
		if(res > 0)
		{
			return true;
		}
		checker |= (1 << ch);
	}
	return false;
}

int main(int argc, char* argv[])
{
	string sInput;
	char str[MAXSIZE];
	while(cin >> sInput)
	{
		bool repeated = isRepeated(sInput);
		//bool repeated = isRepeated_aToZ(sInput);
		if(repeated)
		{
			cout << "repeated" << endl;
		}
		else
		{
			cout << "different" << endl;
		}
	}
	system("pause");
	return 0;
}

你可能感兴趣的:(程序员面试金典)