判断字符串中有无重复字符,不使用额外的数据结构
2017-08-16 04:59
288 查看
CareerCup一道题。原题:Implement an algorithm to determine if a string has all unique characters. What if you can not use additional data structures?
additional data structures我的理解是指自己再定义的数据结构。在这里考虑用数组、bitset、以及一个int类型数 。
在这里考虑用数组、bitset、以及一个int类型数
string是ASCII,占八位,共有256个。从左向右扫描字符串,出现的字符记录下来,当第二次再出现时即可判断。
可以使用bool数组 、bieset,如果只有a-z的小写字符,26为存储即可,用一个int数(32位)即可 。
1、用bool数组
[cpp] view plain copy print?bool isUniqueChars1(string &str) { bool *char_set=new bool[256]; memset(char_set,0,256); for(int i=0; i<str.length(); i++) { if(char_set[str.at(i)]) { delete []char_set; return false; } char_set[str.at(i)]=true; } return true; }
2、用bieset
[cpp] view plain copy print?bool isUniqueChars2(string &str) { bitset<256> char_set; char_set.reset(); for(int i=0; i<str.length(); i++) { if(char_set.test(str.at(i))) return false; char_set.set(str.at(i)); } return true; }
3、用int数,此时假设字符串只包含a-z字符
[cpp] view plain copy print?bool isUniqueChars3(string &str)
{
int checker=0;
for(int i=0; i<str.length(); i++)
{
int val=str.at(i)-‘a’;
if((checker&(1<<val))>0)
return false;
checker|=(1<<val);
}
return true;
}
如果遍历字符串,把每一个字符用来和其他字符做比较,那么时间复杂度O(n^2),但是不用额外空间
如果允许打乱字符串,可以把字符串排序,再扫描一遍即可。排序复杂度O(nlogn)。
additional data structures我的理解是指自己再定义的数据结构。在这里考虑用数组、bitset、以及一个int类型数 。
在这里考虑用数组、bitset、以及一个int类型数
string是ASCII,占八位,共有256个。从左向右扫描字符串,出现的字符记录下来,当第二次再出现时即可判断。
可以使用bool数组 、bieset,如果只有a-z的小写字符,26为存储即可,用一个int数(32位)即可 。
1、用bool数组
[cpp] view plain copy print?bool isUniqueChars1(string &str) { bool *char_set=new bool[256]; memset(char_set,0,256); for(int i=0; i<str.length(); i++) { if(char_set[str.at(i)]) { delete []char_set; return false; } char_set[str.at(i)]=true; } return true; }
bool isUniqueChars1(string &str) { bool *char_set=new bool[256]; memset(char_set,0,256); for(int i=0; i<str.length(); i++) { if(char_set[str.at(i)]) { delete []char_set; return false; } char_set[str.at(i)]=true; } return true; }
2、用bieset
[cpp] view plain copy print?bool isUniqueChars2(string &str) { bitset<256> char_set; char_set.reset(); for(int i=0; i<str.length(); i++) { if(char_set.test(str.at(i))) return false; char_set.set(str.at(i)); } return true; }
bool isUniqueChars2(string &str) { bitset<256> char_set; char_set.reset(); for(int i=0; i<str.length(); i++) { if(char_set.test(str.at(i))) return false; char_set.set(str.at(i)); } return true; }
3、用int数,此时假设字符串只包含a-z字符
[cpp] view plain copy print?bool isUniqueChars3(string &str)
{
int checker=0;
for(int i=0; i<str.length(); i++)
{
int val=str.at(i)-‘a’;
if((checker&(1<<val))>0)
return false;
checker|=(1<<val);
}
return true;
}
bool isUniqueChars3(string &str) { int checker=0; for(int i=0; i<str.length(); i++) { int val=str.at(i)-'a'; if((checker&(1<<val))>0) return false; checker|=(1<<val); } return true; }
如果遍历字符串,把每一个字符用来和其他字符做比较,那么时间复杂度O(n^2),但是不用额外空间
如果允许打乱字符串,可以把字符串排序,再扫描一遍即可。排序复杂度O(nlogn)。
相关文章推荐
- 实现一个算法来判断一个字符串中的字符是否唯一(即没有重复).不能使用额外的数据结构。 (即只使用基本的数据结构)
- 判断字符串中有无重复字符,不用额外额数据结构
- 1.1 设计算法判断一个字符串中字符都是否唯一的。如果不能使用额外的数据结构呢?
- 去除字符串中的重复字符,算法不使用额外缓冲。如abbc->abc
- 【面试经典题之字符串】实现一个算法,确定一个字符串的所有字符是否全都不同。假设不允许使用额外的数据结构
- 1.3 设计一个算法移除字符串中的重复字符,算法不使用额外缓冲。并对你的算法设计测试用例。
- 设计算法并写出代码移除字符串中重复的字符,不能使用额外的缓存空间。注意: 可以使用额外的一个或两个变量,但不允许额外再开一个数组拷贝。
- 位运算(篇1)不使用任何其他的数据结构检查一个字符串中是否有重复字符
- [每天一题]删除字符串中的重复字符(不要使用额外空间)
- CI1.1 实现一个算法,确定一个字符串的所有字符是否全部不同。假使不允许使用额外的数据结构。
- 字符串操作(人民币转成大写/全角字符转半角字符/去掉字符串中重复的子字符串/过滤常见特殊字符/反过滤特殊字符/判断是不是合法手机/字符串匹配的算法)
- 数组字符串系列之:判断一个输入字符串中的每个字符唯一,只能使用基本的数据结构
- Cracking-- 1.1 判断字符串中是否有重复字符
- 正则判断字符串包含重复字符
- careercup top 150判断字符串中字符是否唯一(字符不重复)
- 如何判断字符串是否包含重复字符
- [每天一题]判断字符串里否是都是独一无二的字符(不要用额外空间)
- 判断一个字符串中的字符是否唯一(只用基本数据结构)
- 华为2013校园招聘上机笔试题-数字转化为字符串,并判断有无重复字符串
- 设单链表中存放n个字符,试设计一个算法,使用栈判断该字符串是否中心对称