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

来源:互联网 发布:软件 授权 苹果 编辑:程序博客网 时间:2024/04/29 16:54
#include <iostream>#include <stdio.h>#include <string>using namespace std;const int MAXSIZE = 256;/*问题:实现算法,确定字符串所有字符是否全都不同思路:假设为ASCII字符,那么最多256个,如果字符串长度大于256,必定重复,如果<=256个字符,那么设定一个布尔数组,初始化该数组每个元素为否,表明没有重复出现,如果某字符首次出现,则设定为true,如果某字符对应已经为true,则直接返回输入:chaoyanzhuwenpi输出:repeateddifferent关键: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
原创粉丝点击