子串分值

子串分值(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;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值