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

#include <iostream>
#include <stdio.h>
#include <string>

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值