HJ10 字符个数统计

58 阅读1分钟

题目描述

编写一个函数,计算字符串中含有的不同字符的个数。字符在 ASCII 码范围内( 0~127 ,包括 0 和 127 ),换行表示结束符,不算在字符里。不在范围内的不作统计。多个相同的字符只计算一次。 例如,对于字符串 abaca 而言,有 a、b、c 三种不同的字符,因此输出 3 。

数据范围: 1<=n<=500 题目来源

输入描述

输入一行没有空格的字符串。

输出描述

输入字符串 中范围在(0~127,包括0和127)字符的种数。

示例

输入:abc
输出:3
输入:aaa
输出:1

思路

  • 使用set集合,将字符串a中的全部字符插入到set中。

  • 由于set集合的特性(set中的各元素是各不相同的,并且会按照各元素从小到大进行排序),可用size()函数得到集合中元素的数目。

具体实现

#include<iostream>
#include<set>
using namespace std;
int main(){
    string a;
    getline(cin,a);
    set<char> s; //定义一个set
    for(int i = 0;i<a.length();i++){
        s.insert(a[i]); //将字符串中的字符插入set中
    }
    cout<<s.size()<<endl; //获取set内元素个数
}

时间复杂度

set插入的时间复杂度为O(logN),set.size()的时间复杂度为O(1)。所以总的时间复杂度为O(logN),N为元素个数。

小结

  1. set定义:set是一个内部自动有序且不含重复元素的容器,容器内元素访问需要用迭代器iterator。若要求去掉重复元素可考虑用set,使用时需添加头文件。

  2. set常用函数:

    • insert(x):将x插入set容器中,会自动递增排序和去重,时间复杂度O(logN)。

    • find(v):返回set中对应值为v的迭代器*it,时间复杂度O(logN)。

    • erase(v):删除v的值,时间复杂度O(logN)。(先find找到再删)

    • erase(f,l):删除区间内所有元素,f为起始迭代器,l为所需删除区间的末尾迭代器的下一个地址。(先find找到再删)

    • size():获取set内元素个数,时间复杂度O(1)。

    • clear():清空set中所有元素,时间复杂度O(N)。