9、字串分值和

题目 子串分值和

image-621d7f45

思路分析

大略想了一下 双指针

双指针确定子串 然后k在每个子串中遍历 使用set记录不同元素的数量

三个大循环 估计只能过俩三个案例

#include<bits/stdc++.h>
using namespace std;

int main()
{
	string s;
	cin>>s;
	int n=s.size();
	int sum=0;
	for(int i=0;i<n;i++){
		for(int j=i;j<n;j++){
			set<int> kinds;
			for(int k=i;k<=j;k++){
				kinds.insert(s[k]);
			}
			sum+=kinds.size();
		}
	}
	cout<<sum;
	return 0;
 }

结果过4个 8分

可以去掉一层k循环 只需要枚举每个起点 往后走的过程中 出现的种数只可能增加

image-bfe34047

顺便把效率低的set换成快些的数组(值作下标计数)

#include<bits/stdc++.h>
using namespace std;

const int N=1e5+10;
bool st[N];

int main()

{

	string s;

	cin>>s;

	int n=s.size();

	int sum=0;

	for(int i=0;i<n;i++){

    	memset(st,false,sizeof st);

    	int count=1;

    	st[s[i]]=true;

		for(int j=i;j<n;j++){

			if(!st[s[j]]){

		        count++;

		        st[s[j]]=true;

		      }

	    	sum+=count;

		}

	}

	cout<<sum;

	return 0;

 }

随随便便就多过了两个

何乐而不为

image-5665361d image-f3dc93ef

再要往后优化 就得换个思路了

懒得看 有空回头再去查

代码实现


同类题型

视频讲解


⬅️ 8、回文日期 🏠 00-刷题理模型 ➡️ 第十一届 c++ B组 省赛