题目
【问题描述】
一个字符串的非空子串是指字符串中长度至少为1的连续的一段字符组成的串。例如,字符串 aaab 有非空子串 a,b,aa,ab,aaa,aab,aaab,一共 7 个。
注意在计算时,只算本质不同的串的个数。
请问,字符串 0100110001010001 有多少个不同的非空子串?
这是一道结果填空题,你只需要提交一个能输出正确答案的程序即可。注意:不要输出多余的内容。
答案:
python
#include <iostream>
#include<string>
#include<set>
using namespace std;
int main()
{
set<string> strr;
string s="0100110001010001";
int len=s.length();
for(int j=2;j<=len;j++){
for(int i=0;i<=len-j;i++){
strr.insert(s.substr(i,j));
}
}
cout<<strr.size()+2;
// 请在此输入您的代码*/
return 0;
}
复习一下set的用法:
- set容器:自动排序,不能重复;二叉树
- multiset容器:可重复
1、insert插入
cpp
set<int>s1;
//只能用insert插入
s1.insert(10);
s1.insert(20);
s1.insert(20);
s1.insert(30);
s1.insert(40);
printSet(s1);
2、拷贝构造
把s1的元素值赋到s2,s3里
cpp
set<int>s2(s1);
set<int>s3(s1);
printSet(s2);
3、整体赋值
cpp
set<int>s3;
s3=s2;
4、大小
size
cpp
cout<<"s1.size="<<s1.size()<<endl;
5、交换
swap
cpp
s1.swap(s2);
s1与s2交换
6、删除元素
erase
cpp
//删除容器中值为elem(20)的元素
s1.erase(20);
删除容器中为20的元素
7、查找
查找30在哪个位置
find
cpp
//查找
set<int>::iterator pos=s1.find(30);//返回迭代器(位置)
if(pos!=s1.end())
{
cout<<"找到元素:"<<*pos<<endl;
}
8、统计30的个数
count
cpp
int num=s1.count(30);
cout<<"num="<<num<<endl;
9、利用对组返回两个数据
cpp
pair<int,int> p1=make_pair(10,40);
cout<<p1.first<<" "<<p1.second;
pair
不过和set关系不大,另一个知识点
10、改变排序规则(从大到小)
cpp
//改变set容器的排序规则;指定排序要从大到小
set<int,MyCompare>s4;
s4.insert(10);
s4.insert(20);
s4.insert(20);
s4.insert(30);
s4.insert(40);
for(set<int,MyCompare>::iterator it=s4.begin();it!=s4.end();it++)
{
cout<<*it<<" ";
}
cpp
class MyCompare
{
public:
bool operator()(int v1,int v2)//1重载符号2函数体参数列表
{
return v1>v2;
}
};
s.substr()
string中的一个函数
substr有2种用法:
假设:string s = "0123456789";
string sub1 = s.substr(5); //只有一个数字5表示从下标为5开始一直到结尾:sub1 = "56789"
string sub2 = s.substr(5, 3); //从下标为5开始截取长度为3位:sub2 = "567"