首页 > 其他分享 >子串分值

子串分值

时间:2024-03-30 21:11:51浏览次数:12  
标签:子串 pre 26 int 分值 nex rec sSize

一、题目描述

P8715 [蓝桥杯 2020 省 AB2] 子串分值

二、问题简析

记录字符串 \(s\) 的 第 \(i\) 个字符 \(s_i\)(\(0\leq i<s.size\))上一次出现的位置 \(pre_i\)、下一次出现的位置 \(nex_i\),仅包含 \(s_i\) 的字串个数为 \((i - (pre_i + 1) + 1) * (nex_i - 1 - i + 1)\),即 \((i-pre_i)*(nex_i-i)\)。只需要遍历所有的 \(s_i\),将所有字串个数相加就是所求。

\(pre_i\):因为字符串里只有 \(26\) 个小写字母,所以创建一个容量为 \(26\) 的临时数组 rec[26],记录对应字母上次出现的下标rec[0] 对应 arec[1] 对应 b,以此类推)。

  • 1、因为要记录上一次出现的位置,所以要从左往右遍历,并更新相应的 rec[i]
  • 2、需要注意每个字母首次出现的 \(pre_i\),因为是首次出现,所以下标从 \(0\) 至 \(i\) 的字母都可以是字串的开头,即 \(pre_i+1==0\)。因此,rec[26] 要初始化为 -1

\(nex_i\):与 \(pre_i\) 类似,也需要一个临时数组 rec[26]。不同点:

  • 1、从右往左遍历,并更新相应字母的下标
  • 2、rec[26] 初始化为 s.size,因为每个字母最后一次出现时,下标从 \(i\) 至 \(s.size-1\) 都可以作为字串的结尾,即 \(nex_i-1==s.size-1\)。

三、AC代码

#include <bits/stdc++.h>

using namespace std;
typedef long long ll;

const int MAX = 1e5 + 3;
int pre[MAX], nex[MAX], rec[30];
string s;

int main()
{
	#ifdef LOCAL
	freopen("test.in", "r", stdin);
	#endif
	
	cin >> s;
	int sSize = s.size();
	fill(rec, rec + 26, -1);
	for (int i = 0; i < sSize; i++)
	{
		pre[i] = rec[s[i] - 'a'];
		rec[s[i] - 'a'] = i;
	}
	fill(rec, rec + 26, sSize);
	for (int i = sSize - 1; i >= 0; i--)
	{
		nex[i] = rec[s[i] - 'a'];
		rec[s[i] - 'a'] = i;
	}
	
	ll ans = 0;
	for (int i = 0; i < sSize; i++)
	{
		ans += (i - pre[i]) * (nex[i] - i);
	}
	cout << ans << endl;
	
	return 0;
}

标签:子串,pre,26,int,分值,nex,rec,sSize
From: https://www.cnblogs.com/hoyd/p/18106028

相关文章

  • 每日一练 找无重复字符的最长子串
    我们来看下这个题目,我们要统计的是不重复的子串,我们可以使用“滑动窗口法”,其实我们很容易就能想到思路。我们的左窗代表我们目前遍历的开始,即我们遍历的子串的开头,右窗从左窗开始进行遍历,每次遍历都把当前的字符放入组内,遇到重复则退出计算此时的子串长度,接下来左窗加1继续......
  • 11.子串简写
    11.子串简写-蓝桥云课(lanqiao.cn)问题描述程序猿圈子里正在流行一种很新的简写方法:对于一个字符串,只保留首尾字符,将首尾字符之间的所有字符用这部分的长度代替。例如internation-alization简写成i18nKubernetes(注意连字符不是字符串的一部分)简写成K8sLangiao简写......
  • (57/60)回文子串、最长回文子序列
    DP最后一集回文子串leetcode:647.回文子串动态规划代码实现classSolution{public:/*s[i:j]回文子串个数为dp[i][j]if(s[i]==s[j]){if(j-i<=1)dp[i][j]=true;elsedp[i][j]=dp[i+1][j-1];}全部初始化为0*/intcountSubstrings(strings)......
  • 代码随想录算法训练营第五十七/天 | 516. 最长回文子序列,647. 回文子串
     动态规划最强总结篇!如今动态规划已经讲解了42道经典题目,共50篇文章,是时候做一篇总结了。关于动态规划,在专题第一篇关于动态规划,你该了解这些! (opensnewwindow)就说了动规五部曲,而且强调了五部对解动规题目至关重要!这是Carl做过一百多道动规题目总结出来的经验结晶啊......
  • [暴力题解系列]2023年蓝桥杯-子串简写
    ​ 大伙都说暴力是最低级的算法,啊那确实。但是好的暴力才是真正牛逼的骗分。咱就是说,暴力如何骗分呢?就是基于最暴力的算法一步步优化到能得更多分的暴力。子串简写这题,首先第一步就能想到一件事情:暴力枚举子串开头和末尾的位置,检查是否是符合题目要求的字符,如果是,并且长度大于......
  • python 计算两个字符串最长子串超级加速版
    importjsonimporttimefrommultiprocessingimportPool,Manager,freeze_supportfromnumbaimportjitimportpandasaspdfromtqdmimporttqdmdefdata_set(dataset):fori,one_datainenumerate(tqdm(dataset)):one=one_data[4].repla......
  • 76. 最小覆盖子串c
    booljudge(int*s,int*t){for(inti=0;i<200;i++){if(s[i]<t[i])returnfalse;}returntrue;}char*minWindow(char*s,char*t){intns=strlen(s),nt=strlen(t);char*temp=(char*)malloc(sizeof(char));temp[0]=0;......
  • 字符串匹配/查找字符串中子串存在次数/出现位置下标 问题----- {1.[find] 2.[substr]
    下文将介绍三种方法,求解问题类型:1.子串在主串中出现次数2.子串在主串中每次出现的下标位置以此题为例:题目链接:https://www.luogu.com.cn/problem/P8195解法一:kmp#include<iostream>#include<string>usingnamespacestd;constintN=1e6+10;intne[N];......
  • 第五十七天| 647. 回文子串、5.最长回文子串、516.最长回文子序列
    Leetcode 647.回文子串题目链接:647回文子串题干:给你一个字符串 s ,请你统计并返回这个字符串中 回文子串 的数目。回文字符串 是正着读和倒过来读一样的字符串。子字符串 是字符串中的由连续字符组成的一个序列。具有不同开始位置或结束位置的子串,即使是由相同的......
  • Leetcode刷题-动态规划-最长回文子串
    链接:5.最长回文子串-力扣(LeetCode)给你一个字符串s,找到s中最长的回文子串,如果字符串的反序与原始字符串相同,则该字符串称为回文字符串。示例1:输入:s="babad"输出:"bab"解释:"aba"同样是符合题意的答案。示例2:输入:s="cbbd"输出:"bb"提示:1<=s.length<=1000s......