一、问题描述
一个字符串的非空子串是指字符串中长度至少为 1 的连续的一段字符组成的串。例如,字符串 aaab 有非空子串 a, b, aa, ab, aaa, aab, aaab一共 7 个。
注意在计算时,只算本质不同的串的个数。
请问,字符串 0100110001010001有多少个不同的非空子串?
二、题目要求
考察
模板库set的熟练使用 建议用时15~25min
三、问题分析
这一题主要是对字符串的应用,难度中等。
步骤
第一步,要将字符串分割成一个个子串。第二步,再判断是否是独一无二的一个字串。
这两步,每一步都可以通过C++STL免费提供的函数实现,完全解放双手。
1.分割子串
string库中提供:s.substr(pos,len),其中pos代表输出字符的下标,len代表长度。
2.独一无二
set是一个标准模板库,如果你放进去两个一模一样的物体,他就会吃掉一个,放进去n个,吃掉n-1,只留下一个。
解题前,先别急着看编码,看一下总结与提高部分了解set用法之后,自己上手写一下。
四、编码实现
//set头文件//string头文件usingnamespacestd; intmain() { inti,j; set<string>s; stringt="0100110001010001";//初始化定义for(i=0;i<t.size();i++)//第一层循环 { for(j=0;j<t.size()-i;j++)//第二层循环 { s.insert(t.substr(i,j+1));//将字符串的子串插入到set中// cout<<t.substr(i,j+1)<<"\n"; } } cout<<s.size();//输出元素个数return0; }
五、输出结果
输出结果为:100
六、总结与提高
在C++中,C++ 标准库提供了 set 类类型,支持上述所有的操作,另外还增加了其他更多的功能, 编程时加入头文件:
//或者万能头文件#include<bits/stdc++.h>usingnamespacestd;
Set函数:
用set定义s类(定义什么都可以,只要把s变成定义的字母就可以调用C++中的函数),具体使用方法为:
函数 | 用法 |
常见操作 | |
s.insert(x) | 将元素x插入s之中 |
s.erase(x) | 将元素x从s中删除,删除成功返回1,失败返回0,失败就是没有这个元素 |
s.find(x) | 查找字符串中的元素x |
s.size() | 输出当前存储元素个数 |
s.clear() | 清空当前所有元素 |
s.begin() | 开始值 |
s.end() | 结尾值 |