不同子串[藍橋杯2019初賽]

2020-09-28 20:00:27

題目連結:不同子串
時間限制: 1 Sec 記憶體限制: 256 MB

題目描述:
一個字串的非空子串是指字串中長度至少為1 的連續的一段字元組成的串。
例如,字串aaab 有非空子串a, b, aa, ab, aaa, aab, aaab,一共7 個。
注意在計算時,只算本質不同的串的個數。
請問,字串0100110001010001 有多少個不同的非空子串?

題意:就是算出這個字串有多少個非空子串。
思路:這種填空題,我們執行出結果後,把程式碼註釋掉只列印執行結果即可。

在這裡插入圖片描述

程式碼:

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;

執行結果:
在這裡插入圖片描述
關於程式碼中的 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即可。
另外小可愛們注意,題目沒有要求輸入,所以我們只輸出結果即可。

在這裡插入圖片描述

完整程式碼:

#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; // 直接輸出即可,程式碼註釋掉
}

小可愛們看完別忘了點贊喲,謝謝支援!
在這裡插入圖片描述
加油!

共同努力!

Keafmd