不同子串[蓝桥杯2019初赛]

简介: 一个字符串的非空子串是指字符串中长度至少为1 的连续的一段字符组成的串。例如,字符串aaab 有非空子串a, b, aa, ab, aaa, aab, aaab,一共7 个。注意在计算时,只算本质不同的串的个数。请问,字符串0100110001010001 有多少个不同的非空子串?

题目链接:不同子串

时间限制: 1 Sec 内存限制: 256 MB


题目描述:

一个字符串的非空子串是指字符串中长度至少为1 的连续的一段字符组成的串。

例如,字符串aaab 有非空子串a, b, aa, ab, aaa, aab, aaab,一共7 个。

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

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


题意:就是算出这个字符串有多少个非空子串。

思路:这种填空题,我们运行出结果后,把代码注释掉只打印运行结果即可。


1.gif

代码:


string s;
cin>>s;
int len=s.length();
map<string,int> mp; // 存放截取出来的字符串
int num=0; // 累加不同子串的数量
for(int i=0; i<len; i++)
{
    for(int j=1; j<=len; j++)
    {
        string ss=s.substr(i,j); //从下标i开始截取长度为j的字符串
        if(mp[ss]==0)
        {
            num++;
            mp[ss]++;
        }
    }
}
cout<<num<<endl;

运行结果:

1.png

关于代码中的 substr 我在详细说下,很好理解

str = s.substr(index,length);

就是从s串的index下标处(下标从0开始)截取长度为length的子串赋给str。

举个栗子:


s = “abcdefg”;

str = s.substr(index,length);

str = s.substr(2,3); // 输出:cde

str = s.substr(2); // 输出:cdefg


由上面代码的运行结果可知,这个字符串的不同非空子串数量为100,所以我们直接输出100即可。

另外小可爱们注意,题目没有要求输入,所以我们只输出结果即可。


1.jpg

完整代码:


#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<algorithm>
#include<map>
#include<queue>
#include<stack>
#include<set>
#include<vector>
#include<iomanip>
using namespace std;
int main()
{
    /*string s;
    cin>>s;
    int len=s.length();
    map<string,int> mp; // 存放截取出来的字符串
    int num=0; // 累加不同子串的数量
    for(int i=0; i<len; i++)
    {
        for(int j=1; j<=len; j++)
        {
            string ss=s.substr(i,j); //从下标i开始截取长度为j的字符串
            if(mp[ss]==0)
            {
                num++;
                mp[ss]++;
            }
        }
    }
    cout<<num<<endl;
    */
    cout<<100<<endl; // 直接输出即可,代码注释掉
}


相关文章
|
9月前
子串分值和(蓝桥杯C组)
子串分值和(蓝桥杯C组)
51 0
蓝桥杯历年真题题解----2020年-- 子串分值和
蓝桥杯历年真题题解----2020年-- 子串分值和
|
测试技术 C语言
题目 2572: 蓝桥杯2020年第十一届省赛真题-子串分值
题目 2572: 蓝桥杯2020年第十一届省赛真题-子串分值
|
存储 人工智能 BI
P8597 [蓝桥杯 2013 省 B] 翻硬币个人思考总结+第五届传智杯ABC 初赛题解
桌上放着排成一排的若干硬币。我们用 `*` 表示正面,用 `o` 表示反面(是小写字母,不是零),比如可能情形是 `**oo***oooo`,如果同时翻转左边的两个硬币,则变为 `oooo***oooo`。现在小明的问题是:如果已知了初始状态和要达到的目标状态,每次只能同时翻转相邻的两个硬币,那么对特定的局面,最少要翻动多少次呢?
193 0
蓝桥杯2019年第十届JavaB组真题题目+解析+代码+答案:2.不同子串
蓝桥杯2019年第十届JavaB组真题题目+解析+代码+答案:2.不同子串
140 0
蓝桥杯2019年第十届JavaB组真题题目+解析+代码+答案:2.不同子串
|
Java 测试技术
第十一届蓝桥杯A组省赛试题 H: 子串分值(Java)
第十一届蓝桥杯A组省赛试题 H: 子串分值(Java)
181 0
单片机比赛准备08-蓝桥杯-第六届初赛模拟题(温度采集和控制装置)
单片机比赛准备08-蓝桥杯-第六届初赛模拟题(温度采集和控制装置)
137 0
单片机比赛准备08-蓝桥杯-第六届初赛模拟题(温度采集和控制装置)
单片机比赛准备07-蓝桥杯-第五届初赛模拟题(模拟智能灌溉装置)
单片机比赛准备07-蓝桥杯-第五届初赛模拟题(模拟智能灌溉装置)
106 0
单片机比赛准备07-蓝桥杯-第五届初赛模拟题(模拟智能灌溉装置)
单片机比赛准备06-蓝桥杯-第四届初赛模拟题(自动售水机)
单片机比赛准备06-蓝桥杯-第四届初赛模拟题(自动售水机)
157 0
单片机比赛准备06-蓝桥杯-第四届初赛模拟题(自动售水机)
单片机比赛准备05-蓝桥杯-第三届初赛模拟题(模拟传送装置)
单片机比赛准备05-蓝桥杯-第三届初赛模拟题(模拟传送装置)
150 0
单片机比赛准备05-蓝桥杯-第三届初赛模拟题(模拟传送装置)