当前位置: 首页 > news >正文

【贡献法】2262. 字符串的总引力

本文涉及知识点

贡献法

LeetCode2262. 字符串的总引力

字符串的 引力 定义为:字符串中 不同 字符的数量。
例如,“abbca” 的引力为 3 ,因为其中有 3 个不同字符 ‘a’、‘b’ 和 ‘c’ 。
给你一个字符串 s ,返回 其所有子字符串的总引力 。
子字符串 定义为:字符串中的一个连续字符序列。

示例 1:
输入:s = “abbca”
输出:28
解释:“abbca” 的子字符串有:

  • 长度为 1 的子字符串:“a”、“b”、“b”、“c”、“a” 的引力分别为 1、1、1、1、1,总和为 5 。
  • 长度为 2 的子字符串:“ab”、“bb”、“bc”、“ca” 的引力分别为 2、1、2、2 ,总和为 7 。
  • 长度为 3 的子字符串:“abb”、“bbc”、“bca” 的引力分别为 2、2、3 ,总和为 7 。
  • 长度为 4 的子字符串:“abbc”、“bbca” 的引力分别为 3、3 ,总和为 6 。
  • 长度为 5 的子字符串:“abbca” 的引力为 3 ,总和为 3 。
    引力总和为 5 + 7 + 7 + 6 + 3 = 28 。
    示例 2:
    输入:s = “code”
    输出:20
    解释:“code” 的子字符串有:
  • 长度为 1 的子字符串:“c”、“o”、“d”、“e” 的引力分别为 1、1、1、1 ,总和为 4 。
  • 长度为 2 的子字符串:“co”、“od”、“de” 的引力分别为 2、2、2 ,总和为 6 。
  • 长度为 3 的子字符串:“cod”、“ode” 的引力分别为 3、3 ,总和为 6 。
  • 长度为 4 的子字符串:“code” 的引力为 4 ,总和为 4 。
    引力总和为 4 + 6 + 6 + 4 = 20 。
    提示:
    1 <= s.length <= 105
    s 由小写英文字母组成

贡献法

n = s.length
累计s[i]的对各子串贡献的引力。
s[left…r] 如果有相等的字符,则引力算到第一个字符上,下标最小字符。
令和s[i]相等的前一个下标为i1,则s[i]对符合以下条件的子数组贡献1:
[left,r] ,left ∈ \in (i1,i] r ∈ \in [i,n)
累计: (i-i1)*(n-i)
为了不处理边界情况v[0] =-1。

代码

核心代码

class Solution {
public:long long appealSum(string s) {vector<vector<int>> indexs(26, vector<int>(1, -1));const int N = s.length();for (int i = 0; i < N; i++) {indexs[s[i] - 'a'].emplace_back(i);}long long llRet = 0;for (const auto& v : indexs) {for (int i = 1; i < v.size(); i++) {llRet += (long long)(v[i] - v[i - 1]) * (N - v[i]);}}return llRet;}
};

单元测试

template<class T1, class T2>
void AssertEx(const T1& t1, const T2& t2)
{Assert::AreEqual(t1, t2);
}template<class T>
void AssertEx(const vector<T>& v1, const vector<T>& v2)
{Assert::AreEqual(v1.size(), v2.size());for (int i = 0; i < v1.size(); i++){Assert::AreEqual(v1[i], v2[i]);}
}template<class T>
void AssertV2(vector<vector<T>> vv1, vector<vector<T>> vv2)
{sort(vv1.begin(), vv1.end());sort(vv2.begin(), vv2.end());Assert::AreEqual(vv1.size(), vv2.size());for (int i = 0; i < vv1.size(); i++){AssertEx(vv1[i], vv2[i]);}
}namespace UnitTest
{	string s;TEST_CLASS(UnitTest){public:TEST_METHOD(TestMethod00){s = "c";auto res = Solution().appealSum(s);AssertEx(1LL, res);}TEST_METHOD(TestMethod03){s = "cc";auto res = Solution().appealSum(s);AssertEx(3LL, res);}TEST_METHOD(TestMethod01){s = "abbca";auto res = Solution().appealSum(s);AssertEx(28LL, res);}TEST_METHOD(TestMethod02){s = "code";auto res = Solution().appealSum(s);AssertEx(20LL, res);}};
}

扩展阅读

视频课程

先学简单的课程,请移步CSDN学院,听白银讲师(也就是鄙人)的讲解。
https://edu.csdn.net/course/detail/38771

如何你想快速形成战斗了,为老板分忧,请学习C#入职培训、C++入职培训等课程
https://edu.csdn.net/lecturer/6176

相关推荐

我想对大家说的话
《喜缺全书算法册》以原理、正确性证明、总结为主。
按类别查阅鄙人的算法文章,请点击《算法与数据汇总》。
有效学习:明确的目标 及时的反馈 拉伸区(难度合适) 专注
闻缺陷则喜(喜缺)是一个美好的愿望,早发现问题,早修改问题,给老板节约钱。
子墨子言之:事无终始,无务多业。也就是我们常说的专业的人做专业的事。
如果程序是一条龙,那算法就是他的是睛

测试环境

操作系统:win7 开发环境: VS2019 C++17
或者 操作系统:win10 开发环境: VS2022 C++17
如无特殊说明,本算法用**C++**实现。

http://www.lryc.cn/news/386691.html

相关文章:

  • C#基于SkiaSharp实现印章管理(3)
  • 如何理解泛型的编译期检查
  • 计算机组成原理:海明校验
  • 信息学奥赛初赛天天练-39-CSP-J2021基础题-哈夫曼树、哈夫曼编码、贪心算法、满二叉树、完全二叉树、前中后缀表达式转换
  • 第11章 规划过程组(收集需求)
  • 探索WebKit的守护神:深入Web安全策略
  • unity ScrollRect裁剪ParticleSystem粒子
  • 凤仪亭 | 第7集 | 大丈夫生居天地之间,岂能郁郁久居人下 | 司徒一言,令我拨云见日,茅塞顿开 | 三国演义 | 逐鹿群雄
  • React实战学习(一)_棋盘设计
  • 【LeetCode】每日一题:三数之和
  • 逆风而行:提升逆商,让困难成为你前进的动力
  • 新能源汽车CAN总线故障定位与干扰排除的几个方法
  • 【涵子来信】——社交宝典:克服你心中的内向,世界总有缺陷
  • LabVIEW项目外协时选择公司与个人兼职的比较
  • 汽车电子工程师入门系列——CAN 规范系列通读
  • 泽众云真机-平台华为机型HarmonyOS NEXT系统已上线!
  • AI基础:从线性回归到梯度下降
  • AI产品经理面试
  • 二进制方式部署consul单机版
  • SpringBoot整合Quartz实现动态定时任务
  • qt 用宏控制静态接口的统一
  • pdf怎么转换成jpg,本地转换还是在线转换?
  • 【物联网】802.15.4简介
  • C++基础语法:复制构造函数,赋值构造函数及浅复制,深复制
  • 架构是怎样练成的-楼宇监控系统案例
  • valgrind使用浅谈
  • 强化学习专题:强化学习知识梳理(一)
  • 深入JVM:详解JIT即时编译器
  • ORBSLAM3_ROS_Ubuntu18_04环境搭建安装
  • 【opencv - C++ - Ubuntu】putText 显示中文最快方法