#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;
}
程序员面试金典: 9.1数组与字符串 1判断字符串所有字符全都不同
最新推荐文章于 2020-04-22 13:32:05 发布