1、哈希表的使用
判断一个字符串所有字符是否都是唯一的。
分析:判断是否唯一,用哈希表或者bitset判断元素是否出现。如果考虑哈希表,建立键-值对是关键,可以用字符直接作为键,出现次数作为值。判断是否唯一,那么只需要判断哈希表中是否已经存在当前键,所以可以通过利用insert函数的返回值,做出相应的判断。
如果,利用bitset,则需要建立字符到整数下标的映射关系。
考虑复杂度:
哈希表和bitset都需要扫描整个字符串,每次插入操作的时间复杂度O(1),假设字符长度为n,平均的时间复杂度就是O(n),空间上,每个合法的字符都有可能出现,假设字符集大小为m,则平均空间是O(m),哈希表的数据结构需要占据更多的空间,所以bitset是更合理的数据结构。
参考:
bool isUnique(string input){
bitset<256> hashMap;
for (int i = 0; i < input.length; i++){
if (hashMap[(int)input[i]]){
return false;
}
hashMap[(int)input[i]] = 1;
}
return true;
}
延伸:
1、Bitset是C++语言的一个类库。
Abitset stores bits (elements with only two possible values: 0 or 1, true
or false
, ...). bitset对象存储位(元素只有两个可能的值:0或1)
具体可参考:http://www.cplusplus.com/reference/bitset/bitset/
2、insert函数
C++容器的insert()函数有以下三种用法: 最终*it=val;
//用法1:在指定位置it前“插入”值为val的元素,返回指向这个元素的迭代器,
iterator insert( iterator it, const TYPE &val );
//用法2:在指定位置it前“插入”num个值为val的元素
void insert( iterator it, size_type num, const TYPE &val );
//用法3:在指定位置it前“插入”区间[start, end)的所有元素.
void insert( iterator it, input_iterator start, input_iterator end );