題目連結:不同子串
時間限制: 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