面试题——字符串去重

对于字符串去重这个问题,要求时间和空间复杂度都很小,我思考了很久,不知道用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的语法描述

扫描二维码关注公众号,回复: 136643 查看本文章

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;
}

猜你喜欢

转载自blog.csdn.net/m0_37885286/article/details/79682536