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

716 阅读2分钟

「这是我参与2022首次更文挑战的第28天,活动详情查看:2022首次更文挑战

一、问题描述

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

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

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

二、题目要求

考察

1.哈希、set
2.建议用时15~25min

三、问题分析

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

步骤

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

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

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

1.png

六、总结与提高

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