字符串分值

简介: 从另一个方向看,可以考虑每个字符对结果的贡献值分别是多少;分别向左右两个方向查找该字符,向左找到该字符的位置记录为left(找不到就为0);向右找到该字符的位置记录为right(找不到就为字符串长度+1);向左找到的位置就是该字符做贡献的开始,向右找到的位置就是该字符做贡献的结束;不难推理出:每个字符的贡献值为(i-left)*(right-i) i为该字符的位置(从1开始计数);那样例来说:第一个a向左查找,left记为0,向右查找,right记为3,那么第一个a的贡献值为(1-0)*(3-1)==2;类推:(2-0)*(4-2)==4;(3-1)*(6-3)=
#include<cstring>
#include<map>
using namespace std;
const int N = 100100;
typedef long long ll;
char s[N];
ll idx;
int main()
{
    cin>>s+1;
    ll len=strlen(s+1);
    ll l=0,r=len+1;
    
    for(int i=1;i<=len;i++)
    {
        char c;
        c=s[i];
        ll right=len+1,left=0;
        
        //向左查找到与该字符相同的位置并记录 
        for(int ll=i-1;ll>=0;ll--)
        {
            if(s[ll]==c)
            {
                left=ll;
                break;
            }
        }
        //向右查找到与该字符相同的位置并记录 
        for(int rr=i+1;rr<=len;rr++)
        {
            if(s[rr]==c)
            {
                right=rr;
                break;
            }
        }
        //记录贡献值 
        idx+=(i-left)*(right-i);
    }
    cout<<idx;
    return 0;
}
相关文章
|
3月前
leetcode-1220:统计元音字母序列的数目
leetcode-1220:统计元音字母序列的数目
30 0
|
3月前
|
算法
LeetCode算法题---无重复字符的最长子串、寻找两个正序数组的中位数(三)
LeetCode算法题---无重复字符的最长子串、寻找两个正序数组的中位数(三)
39 0
|
2月前
|
人工智能 算法 测试技术
【字符串】【C++算法】828.统计子串中的唯一字符
【字符串】【C++算法】828.统计子串中的唯一字符
|
3月前
|
算法 测试技术 C#
【map】【滑动窗口】【字典树】C++算法:最长合法子字符串的长度
【map】【滑动窗口】【字典树】C++算法:最长合法子字符串的长度
|
8月前
|
存储 算法
算法之字符串问题(第415题字符串相加、第43题字符串相乘、第316题去除重复字母)
算法之字符串问题(第415题字符串相加、第43题字符串相乘、第316题去除重复字母)
52 0
|
7月前
逆序一个字符串的每一组单词(不是倒叙)
整体思路: 1.先将整个字符串倒叙:i like china.->.anihc ekil i 2.将倒叙后的每一块单词再倒叙:.anihc->china. 想必大家都发现了,倒叙整个字符串和倒叙每一块是一样的,那么我们不妨写一个倒叙的函数在这里用reserve表示!
31 0
|
8月前
从排列字符串到排列序列:解析增减字符串匹配问题
题目要求根据给定的字符串 s,构造一个排列序列 perm,其中排列序列中的数字满足以下规则: 如果 perm[i] < perm[i + 1],则对应的字符为 'I'; 如果 perm[i] > perm[i + 1],则对应的字符为 'D'。 我们需要根据字符串 s 中的字符,构造满足上述规则的排列序列 perm。
40 0
LeetCode-1220 统计元音字母序列的数目
LeetCode-1220 统计元音字母序列的数目
|
8月前
|
C++
子串分值和
对于一个字符串 S,我们定义 S 的分值 f (S ) 为 S 中出现的不同的字符个数。
34 0
|
11月前
|
算法
1304 字符串的相似度 后缀数组
1304 字符串的相似度 后缀数组
49 0