且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

算法题每日一练---第27天:不同子串

更新时间:2022-10-13 11:56:47

一、问题描述


一个字符串的非空子串是指字符串中长度至少为 1 的连续的一段字符组成的串。例如,字符串 aaab 有非空子串 a, b, aa, ab, aaa, aab, aaab一共 7 个。

注意在计算时,只算本质不同的串的个数。

请问,字符串 0100110001010001有多少个不同的非空子串?


二、题目要求


考察

模板库set的熟练使用
建议用时15~25min


运行限制

  • 最大运行时间:1s
  • 最大运行内存: 128M


三、问题分析


这一题主要是对字符串的应用,难度中等。

步骤

第一步,要将字符串分割成一个个子串。
第二步,再判断是否是独一无二的一个字串。

这两步,每一步都可以通过C++STL免费提供的函数实现,完全解放双手。


1.分割子串

string库中提供:
s.substr(pos,len),其中pos代表输出字符的下标,len代表长度。


2.独一无二

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

算法题每日一练---第27天:不同子串


六、总结与提高


在C++中,C++ 标准库提供了 set 类类型,支持上述所有的操作,另外还增加了其他更多的功能, 编程时加入头文件:

#include<set>//或者万能头文件#include<bits/stdc++.h>
using namespace std;


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() 结尾值