这段代码实现了一个计算字符串中连续相同字符数量的算法。下面将逐行解释代码的含义:

  1. #include <iostream>#include <string>#include <vector>:这三行代码分别包含了输入输出流、字符串操作和向量容器的库文件,为代码中使用相关的功能提供支持。

  2. using namespace std;:这行代码表示使用标准库命名空间,避免在代码中反复写 std:: 前缀。

  3. int main() { ... }:这段代码定义了主函数 main,程序从这里开始执行。

  4. int n, k;:声明了两个整型变量 nk,用于存储输入的字符串长度和查询次数。

  5. cin >> n >> k;:从输入流中读取 nk 的值。

  6. string s;:声明了一个字符串变量 s,用于存储输入的字符串。

  7. cin >> s;:从输入流中读取字符串 s

  8. vector<int> prefix_count(n, 0);:声明了一个大小为 n 的整型向量 prefix_count,用于存储前缀数组,并将所有元素初始化为 0。

  9. prefix_count[0] = 0;:将前缀数组的第一个元素初始化为 0。

  10. for (int i = 1; i < n; ++i) { ... }:这段代码使用循环遍历字符串 s 从下标 1 到 n-1

  11. prefix_count[i] = prefix_count[i - 1] + (s[i] == s[i - 1]);:对于每个下标 i,如果 s[i] 等于 s[i-1],则 prefix_count[i] 等于 prefix_count[i-1] 加 1,否则等于 prefix_count[i-1]。这部分代码计算了前缀数组,prefix_count[i] 表示从字符串开头到下标 i 的连续相同字符的数量。

  12. for (int i = 0; i < k; ++i) { ... }:这段代码使用循环处理 k 次查询。

  13. int l, r;:声明了两个整型变量 lr,用于存储每个查询的左右边界。

  14. cin >> l >> r;:从输入流中读取 lr 的值。

  15. int count = 0;:声明了一个整型变量 count,用于存储查询结果,并将其初始化为 0。

  16. if (r - l >= 2) { ... }:如果查询的区间长度大于等于 2,则进行以下操作。

  17. count = prefix_count[r - 2] - (l > 1 ? prefix_count[l - 2] : 0);:计算查询区间内的连续相同字符数量。prefix_count[r - 2] 表示从字符串开头到 r-2 的连续相同字符数量,prefix_count[l - 2] 表示从字符串开头到 l-2 的连续相同字符数量,两者的差值即为查询区间内的连续相同字符数量。如果 l 大于 1,则需要减去 prefix_count[l - 2],否则不用减去。

  18. cout << count << endl;:输出查询结果。

  19. return 0;:程序正常结束,返回 0。

这段代码通过前缀数组优化了查询操作的效率,对于每个查询只需要进行一次常数时间的计算,从而提高了代码的效率。

C++ 代码解析:计算字符串中连续相同字符的数量

原文地址: https://www.cveoy.top/t/topic/bNsI 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录