这里是蓝桥杯历年的题目,欢迎关注公众号“放码过来呀”
题目名称: 子串分值和
【问题描述】
对于一个字符串 S,我们定义 S 的分值 f(S ) 为 S 中出现的不同的字符个数。例如 f(”aba”) = 2,f(”abc”) = 3, f(”aaa”) = 1。现在给定一个字符串 S [0…n − 1](长度为 n),请你计算对于所有 S 的非空子串 S [i… j](0 ≤ i ≤ j < n),f(S [i… j]) 的和是多少。
【输入格式】
输入一行包含一个由小写字母组成的字符串 S。
【输出格式】
输出一个整数表示答案。
【样例输入】
ababc
【样例输出】
28
【样例说明】
子串 f值
a 1
ab 2
aba 2
abab 2
ababc 3
b 1
ba 2
bab 2
babc 3
a 1
ab 2
abc 3
b 1
bc 2
c 1
【评测用例规模与约定】
对于 20% 的评测用例,1 ≤ n ≤ 10;
对于 40% 的评测用例,1 ≤ n ≤ 100;
对于 50% 的评测用例,1 ≤ n ≤ 1000;
对于 60% 的评测用例,1 ≤ n ≤ 10000;
对于所有评测用例,1 ≤ n ≤ 100000。
题目解析:
通过观察,需要将所有字串可能列出,判断字串中不同的个数,依次将结果相加,输出答案
题目代码:
#include<iostream>
#include<cstring>
#include<set>
using namespace std;
string s;
int ans;//记录答案
int get_nub(string s);//获取字串不同的个数
int main ()
{
cin>>s;
for(int i=0;i<s.size();i++)
for(int j=i;j<s.size();j++)
{
string sub=s.substr(i,j-i+1);
//substr的第一个参数是从第X位开始截取,第二个参数是截取X位
//得到所有字符串集
ans+=get_nub(sub);
//对每个字符串集的个数进行统计
}
cout<<ans<<endl;
return 0;
}
int get_nub(string s)
{
set<char>st;
//声明了一个char类型的集合
//删除相同元素并默认元素按照从小到大的顺序排序
for(int i=0;i<s.size();i++)
{
st.insert(s[i]);
//在set中输入数据
}
return st.size();
} //输出st的长度,也就代表不同的字符个数
运行结果:
题后总结:
我是学完c++的一点知识就开始刷题,导致一些string函数在c++中的使用不熟悉,同时没有了解到STL中<set>的使用
知识点:
字符串名称.size() 求的是字符串的长度
字符串名称.substr(i,j) 截取字符串,i表示从第i位开始截取,j表示从第i位向后截取j位