子串分值(2020年蓝桥杯c/c++A组H题)
题目描述
对于一个字符串 S,我们定义 S 的分值 f(S) 为 S中恰好出现一次的字符个数。例如 f(“aba”) = 1,f(“abc”) = 3, f(“aaa”) = 0。
现在给定一个字符串S[0⋯n−1](长度为 n,1≤n≤10 5 ),请你计算对于所有 S 的非空子串 S[i…j](0 ≤ i ≤ j < n) (0≤i≤j<n),f(S[i…j]) 的和是多少。
输入描述
输入一行包含一个由小写字母组成的字符串 S。
输出描述
输出一个整数表示答案。
输入输出样例
示例
输入:
ababc
输出:
21
运行限制
最大运行时间:1s
最大运行内存: 256M
思路分析:
要解决三个问题:
①子字符串问题 :两层循环来遍历所有的子串,循环时要小心,长度为1也是一个子串
②判断子串中的字符的个数问题 :开一个数组来存储字母出现的次数(一层循环)
③判断出现一次的字母个数 :if(a[i]==1)(一层循环)
PS:1、全局变量的设置:数组、字符串、个数
2、后两个问题的实现封装到一个函数内
3、不要觉得问题复杂就懒得实现,从基础想法做起,不要乱想
代码部分
#include<bits/stdc++.h>
using namespace std;
string s;
int a[26];
int sum;
void Function(int x,int y)
{
memset(a,0,sizeof(a));
for(int i=x ; i<=y ; i++)
{
a[s[i]-'a']++;
}
for(int j=0 ; j<26 ; j++)
{
if(a[j]==1) sum++;
}
}
int main()
{
cin>>s;
for(int i=0 ; i<s.length() ; i++)//注意是到length而不是length-1
{
for(int j=i ; j<s.length() ; j++)//注意是从i开始而不是i+1,因为一个字符也是一个子串
{
Function(i,j);
}
}
cout<<sum;
return 0;
}