计算C ++中给定字符串的所有子字符串的唯一字符
现在,在给定字符串s的情况下,我们必须找到countUniqueChars(t)的总和,其中t是s的子字符串。(这里有些子字符串可以重复,因此在这种情况下,我们也必须计算重复的子字符串。)
由于答案可能非常大,我们可以以10^9+7为模返回答案。
因此,如果输入类似于“HELLOWORLD”,则输出将为128
为了解决这个问题,我们将遵循以下步骤-
定义一个函数add()
,这将需要a,b,
return(amodm)+(bmodm)
定义一个函数mul()
,这将需要a,b,
return(amodm)*(bmodm)
从主要方法中,执行以下操作-
n:=s的大小
回答:=0
定义大小为26的数组cnt
对于初始化i:=0,当i<n时,更新(将i增加1),执行-
在cnt[x-'A']的末尾插入-1
x:=s[i]
如果cnt[x-'A']的大小等于0,则-
在cnt[x-'A']的末尾插入i
对于初始化i:=0,当i<26时,更新(将i增加1),执行-
temp:=mul(cnt[i,j]-cnt[i,j-1],cnt[i,j+1]-cnt[i,j])
ans:=添加(ans,temp)
忽略以下部分,跳至下一个迭代
如果cnt[i]的大小等于0,则-
在cnt[i]的末尾插入n
对于初始化j:=1,当j<cnt[i]的大小时,更新(将j增加1),执行-
返回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