对于字符串去重这个问题,要求时间和空间复杂度都很小,我思考了很久,不知道用set会不会相对来说小一些,希望大牛们给我指正一下。
接下来介绍一下
set和multiset都是基于红黑树实现的,其中查找、删除和插入操作都只需要O(logk)时间。
set和multiset所需的头文件:
#include
定义:
set/multiset <类型> 名字。
set与multiset的区别:
set中没有相同元素,而multiset可以有相同元素。
set与multiset的相同操作:
s.insert(x) 把x元素插入s中。
s.empty()=0 s中有元素,s.empty()=1 s中没有元素。
multiset/set<类型>::iterator it=s.lower_bound(x) 返回s中大于等于x的最小值,并且这个值在s中的位置为it,*it表示这个位置的值。
multiset/set<类型>::iterator it=s.upper_pound(x) 返回s中大于x的最小值,并且这个值在s中的位置为it,*it表示这个位置的值。
set与multiset的不同操作:
当s为set型时 s.erase(x) 删除s中的x元素
当s为multiset型时 s.erase(it) 删除s中it位置上的数
因为在剑指offer上看到了
typedef multiset < int, greater< int > > intSet;
于是查了一下typedef的语法描述
typedef的语法描述
为了解决用户自定义数据类型名称的需求,C语言中引入类型重定义语句typedef,可以为数据类型定义新的类型名称,从而丰富数据类型所包含的属性信息。
typedef的语法描述
typedef 类型名称 类型标识符;
比如 typedef multiset < int, greater< int > > intSet;
intSet set;
那么此时set的类型就是multiset < int, greater< int > >
下面是我实现的字符串去重
#include<iostream>
#include<set>
#include<string>
using namespace std;
int main(){
typedef set<char> set_t;
set_t str;
string str1;
cin >> str1;
for (int i = 0; i < str1.size(); i++){
str.insert(str1[i]);
}
//str.cbegin()也就是只允许读,不允许改
//str.cedn()也是只允许读,不允许改
for (set_t::const_iterator p = str.cbegin(); p != str.cend(); ++p)
cout << *p ;
system("pause");
return 0;
}