C++中给定字符串所有子串的唯一字符计数


假设我们想定义一个名为countUniqueChars(s)的函数,它将返回s中唯一字符的数量。如果s = "HELLOWORLD",则"H"、"E"、"W"、"R"、"D"是唯一字符,因为它们在s中只出现一次,因此countUniqueChars(s) = 5。

现在在这个问题中,给定一个字符串s,我们必须找到countUniqueChars(t)的总和,其中t是s的子串。(这里有些子串可能会重复,在这种情况下,我们也必须计算重复的子串。)

由于答案可能非常大,我们可以返回答案模10^9+7。

因此,如果输入像"HELLOWORLD",则输出将为128。

为了解决这个问题,我们将遵循以下步骤:

  • 定义一个函数add(),它将接收a, b,

  • 返回(a mod m) + (b mod m)

  • 定义一个函数mul(),它将接收a, b,

  • 返回(a mod m) * (b mod m)

  • 从主方法中执行以下操作:

  • n := s的大小

  • ans := 0

  • 定义一个大小为26的数组cnt

  • 对于初始化i := 0,当i < n时,更新(i增加1),执行:

    • x := s[i]

    • 如果cnt[x - 'A']的大小与0相同,则:

      • 在cnt[x - 'A']的末尾插入-1

    • 在cnt[x - 'A']的末尾插入i

  • 对于初始化i := 0,当i < 26时,更新(i增加1),执行:

    • 如果cnt[i]的大小与0相同,则:

      • 忽略以下部分,跳到下一个迭代

    • 在cnt[i]的末尾插入n

    • 对于初始化j := 1,当j < cnt[i]的大小时,更新(j增加1),执行:

      • temp := mul(cnt[i, j] - cnt[i, j - 1], cnt[i, j + 1] - cnt[i, j])

      • ans := add(ans, temp)

  • 返回ans

让我们看看下面的实现以获得更好的理解:

示例

 在线演示

#include <bits/stdc++.h>
using namespace std;
typedef long long int lli;
const lli m = 1e9 + 7;
class Solution {
   public:
   lli add(lli a, lli b){
      return (a % m) + (b % m);
   }
   lli mul(lli a, lli b){
      return (a % m) * (b % m);
   }
   int uniqueLetterString(string s) {
      int n = s.size();
      int ans = 0;
      vector<int> cnt[26];
      for (int i = 0; i < n; i++) {
         char x = s[i];
         if (cnt[x - 'A'].size() == 0) {
            cnt[x - 'A'].push_back(-1);
         }
         cnt[x - 'A'].push_back(i);
      }
      for (int i = 0; i < 26; i++) {
         if (cnt[i].size() == 0)
         continue;
         cnt[i].push_back(n);
         for (int j = 1; j < cnt[i].size() - 1; j++) {
            lli temp = mul(cnt[i][j] - cnt[i][j - 1], cnt[i][j +
            1] - cnt[i][j]);
            ans = add(ans, temp);
         }
      }
      return ans;
   }
};
main(){
   Solution ob;
   cout << (ob.uniqueLetterString("HELLOWORLD"));
}

输入

"HELLOWORLD"

输出

128

更新于:2020年6月8日

542 次查看

开始您的职业生涯

通过完成课程获得认证

开始
广告