首页 > 其他分享 >字符串的总引力

字符串的总引力

时间:2023-10-29 13:33:23浏览次数:29  
标签:子串 字符 结尾 引力 long 字符串

字符串的 引力 定义为:字符串中 不同 字符的数量。

例如,"abbca" 的引力为 3 ,因为其中有 3 个不同字符 'a'、'b' 和 'c' 。
给你一个字符串 s ,返回 其所有子字符串的总引力 。

子字符串 定义为:字符串中的一个连续字符序列。

1. 区间贡献法

从左往右遍历,优先计算左边同一字符做出的贡献,后面出现的相同字符不再计入贡献,被前面覆盖,只计算不受前面相同字符影响的区间
相比其他贡献法的题目更好计算,只需考虑左侧的辖域范围,右侧默认完全统辖
故需要记录每一类字符上一次出现的位置

class Solution {
public:
    long long appealSum(string s) {
        vector<int> lasts(26, -1);
        long long res = 0;
        for(int i = 0; i < s.size(); ++i) {
            res += 1ll * (i - lasts[s[i] - 'a']) * ((int)s.size() - i);
            lasts[s[i] - 'a'] = i;
        }
        return res;
    }
};

2. 转移法

考虑两组相邻的子串:以 s[i−1] 结尾的子串、以 s[i]结尾的子串。
以 s[i] 结尾的子串,可以看成是以 s[i−1] 结尾的子串,在末尾添加上 s[i] 组成。
从左往右遍历 s,考虑将 s[i] 添加到以 s[i−1] 结尾的子串的末尾。
添加后,这些以 s[i−1] 结尾的子串的引力值会增加的值,等价于方法一种s[i]统辖的左侧范围

class Solution {
public:
    long long appealSum(string &s) {
        long long ans = 0;
        vector<int> last(26, -1); // 初始化成 -1 
        for (int i = 0, sum = 0; i < s.size(); ++i) {
            sum += i - last[s[i] - 'a']; //以当前遍历位置为结尾的子字符串总吸引力
            ans += sum; //统计所有位置子字符串
            last[s[i] - 'a'] = i;//更新辖域
        }
        return ans;
    }
};

标签:子串,字符,结尾,引力,long,字符串
From: https://www.cnblogs.com/929code/p/17795802.html

相关文章

  • 【题解】P9753 [CSP-S 2023] 消消乐(字符串哈希,DP)
    【题解】P9753[CSP-S2023]消消乐不知道考场脑子是抽了还是有病,全程都不知道在放什么屁。特别鸣谢:@dbxxx给我讲解了解法一的满分做法,并让我对哈希有了更加深刻的认识;@Daidly给我讲解了解法二。题目链接P9753[CSP-S2023]消消乐题意概述给定一个长度为\(n\)的只含小......
  • 无重复字符的最长子串(给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长
    importjava.util.*;publicclassSolution{/***代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可***@paramarrint整型一维数组thearray*@returnint整型*/publicintmaxLength(int[]arr){......
  • 28. 找出字符串中第一个匹配项的下标
    目录题目法一、KMP法二、切片法三、两行题目给你两个字符串 haystack和needle,请你在haystack字符串中找出needle字符串的第一个匹配项的下标(下标从0开始)。如果 needle不是haystack的一部分,则返回 -1。示例1:输入:haystack="sadbutsad",needle="sad"......
  • 如何遍历字符串的单词?
    内容来自DOChttps://q.houxu6.top/?s=如何遍历字符串的单词?如何遍历由空格分隔的单词组成的字符串中的单词?请注意,我对C字符串函数或那种字符操作/访问不感兴趣。我更喜欢优雅而不是效率。我目前的解决方法:#include<iostream>#include<sstream>#include<string>using......
  • 【pwn】[MoeCTF 2022]babyfmt --格式化字符串漏洞,got表劫持
    拿到程序,先checksec一下发现是PartialRELRO,got表可修改当RELRO保护为NORELRO的时候,init.array、fini.array、got.plt均可读可写;为PARTIALRELRO的时候,ini.array、fini.array可读不可写,got.plt可读可写;为FULLRELRO时,init.array、fini.array、got.plt均可读不可写。然后看主......
  • C++字符串
    C++字符串C++提供了两种类型的字符串表示形式:C风格字符串C++引入的string类类型C风格字符串C风格的字符串源于C语言,并在C++中继续得到支持。字符串实际上是使用Null字符终止的一堆字符数组。因此一个以NULL结尾的字符串,包含了组成字符串的字符。下面的声明和初始化创建了......
  • 28. 找出字符串中第一个匹配项的下标
    1.题目介绍给你两个字符串haystack和needle,请你在haystack字符串中找出needle字符串的第一个匹配项的下标(下标从0开始)。如果needle不是haystack的一部分,则返回-1。示例1:输入:haystack="sadbutsad",needle="sad"输出:0解释:"sad"在下标0和6处匹配。......
  • LeedCode刷题(1)-交替合并字符串
    1.交替合并字符串题目:给你两个字符串word1和word2。请你从word1开始,通过交替添加字母来合并字符串。如果一个字符串比另一个字符串长,就将多出来的字母追加到合并字符串的末尾。示例1:输入:word1="abc",word2="pqr"输出:"apbqcr"解释:字符串合并情况如下所示:word1:ab......
  • 151. 反转字符串中的单词
    给你一个字符串s,请你反转字符串中单词的顺序。单词是由非空格字符组成的字符串。s中使用至少一个空格将字符串中的单词分隔开。返回单词顺序颠倒且单词之间用单个空格连接的结果字符串。注意:输入字符串s中可能会存在前导空格、尾随空格或者单词间的多个空格。返回......
  • 字符串中的BKDRHash哈希函数
    字符串中的BKDRHash哈希函数在计算机科学中,哈希函数是一种将任意长度的输入(也称为“消息”)通过散列算法转换成固定长度的输出,该输出就是哈希值。哈希函数的一个重要特性是,对于相同的输入,无论何时执行哈希函数,它都应该产生相同的输出。然而,对于不同的输入,即使它们只有微小的差别,哈......