更新时间:2022-10-13 11:56:47
一个字符串的非空子串是指字符串中长度至少为 1 的连续的一段字符组成的串。例如,字符串 aaab 有非空子串 a, b, aa, ab, aaa, aab, aaab一共 7 个。
注意在计算时,只算本质不同的串的个数。
请问,字符串 0100110001010001有多少个不同的非空子串?
模板库set的熟练使用 建议用时15~25min
这一题主要是对字符串的应用,难度中等。
步骤
第一步,要将字符串分割成一个个子串。 第二步,再判断是否是独一无二的一个字串。
这两步,每一步都可以通过C++STL免费提供的函数实现,完全解放双手。
string库中提供: s.substr(pos,len),其中pos代表输出字符的下标,len代表长度。
set是一个标准模板库,如果你放进去两个一模一样的物体,他就会吃掉一个,放进去n个,吃掉n-1,只留下一个。
解题前,先别急着看编码,看一下总结与提高部分了解set用法之后,自己上手写一下。
#include <iostream> #include<set>//set头文件 #include<string>//string头文件 using namespace std; int main() { int i,j; set<string>s; string t="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();//输出元素个数 return 0; }
输出结果为:100
在C++中,C++ 标准库提供了 set 类类型,支持上述所有的操作,另外还增加了其他更多的功能, 编程时加入头文件:
#include<set>//或者万能头文件#include<bits/stdc++.h> using namespace std;
用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() | 结尾值 |