C++ 中字符出现频率最多为奇数的子串数量

17 Mar 2025 | 4 分钟阅读

在本文中,我们将讨论如何用不同的方法计算C++中最多只有一个字符频率为奇数的子字符串数量。

字符串中连续的字符子集或序列称为子字符串。

现在有必要确定在此问题中,最多有一个奇数频率字符的子字符串数量。让我们看看处理这种情况最有效的方法。

让我们尝试用几个例子来理解这个问题。

输入

输出

21

解释: 给定字符串中字符的频率如下:

  • k → 3
  • s → 3
  • j → 2

现在,最多包含一个字符且出现次数为奇数的子字符串可以是:

  • 每次取一个字母:'k', 's', 'j', 's', 's', 'j', 'k', 'k' = 8
  • 每次取两个字母:'ss', 'kk' = 2
  • 每次取三个字母:'sjs', 'jss', 'ssj', 'jkk' = 4
  • 每次取四个字母:'jssj' = 1
  • 每次取五个字母:'sjssj', 'jssjk', 'ssjkk' = 3
  • 每次取六个字母:'jssjkk' = 1
  • 每次取七个字母:'ksjssjk', 'sjssjkk' = 2
  • 每次取八个字母:无字符串

现在,将子字符串的数量相加,得到 (8 + 2 + 4 + 1 + 3 + 1 + 2) = 21

输入

输出

2

解释: 在这里,你将得到2个子字符串:'a', 'b'

问题陈述

让我们尝试理解这个问题并找到一个可行的答案。我们需要找到字符串中平均只有一个字母出现奇数次的子字符串;总共应该只有一个奇数频率的字母。

解决方案1:暴力破解法

这种方法很容易理解。在这种方法中,我们将只执行循环并持续验证是否存在一个具有奇数频率的字母。如果存在,该子字符串将被包含在最终结果中。

示例

输出

Count of substrings with the frequency of at most one character as Odd in C++

复杂度分析

时间复杂度

O(n^3); 其中n是字符串的长度,(n^3)是辅助函数的时间复杂度,而(O(n))是checkValid函数的执行时间。

空间复杂度

O(1); 上述代码不包含存储在数据结构中的任何变量。

解决方案2:使用位掩码的优化解决方案

位掩码

位掩码是一种用于对值应用掩码以保留、更改或修改给定数据的一部分的过程。掩码有助于选择要保留或从二进制整数中移除的位。通过应用不同的按位操作,它可以用于掩盖一个值以表示集合的子集。

方法

我们使用位掩码来识别哪些字符出现奇数次。我们使用哈希映射来存储之前看到的位掩码。每次迭代后,我们将 hashmap[bitmask] 增加一,表示我们熟悉这个位掩码。当 output += m[mask] 时,将统计使用偶数个字母的子字符串。当只有一个字母出现奇数次时,output+= m[mask^ (1\<j)] 将统计子字符串。

示例

输出

Count of substrings with the frequency of at most one character as Odd in C++

复杂度分析

时间复杂度

O(n*26);n是字符串的长度。我们对字符串中的每个字符都有26个字符的检查。

空间复杂度

O(1):我们唯一使用的数据结构是映射,它占用O(26)空间,这大致相当于O(1)空间复杂度。

结论

首先,我们将使用简单的循环方法来获取所需结果。这种方法易于理解,但其缺点是需要大量的处理时间才能完成。但是,我们可以通过采用另一种称为带有哈希映射位掩码的方法来快速确定代码的时间复杂度。位掩码方法在这个特定主题中得到了不寻常的应用,将时间复杂度从O(n^3)降低到O(n)。在本文中,我们研究了位掩码的原理和应用。