字符串中的子字符串计数

Posted

技术标签:

【中文标题】字符串中的子字符串计数【英文标题】:substring count in a string 【发布时间】:2020-05-31 15:25:55 【问题描述】:

给定一个长度为 n 的字符串 s。我们必须计算存在给定字符串的字符 s[i] 的子字符串的数量,其中字符 s[i] 是元音。

示例:在此字符串“coding”中,字符“o”出现在 10 个子串中,字符“i”出现在 12 个子串中。所以总共有 22 个答案。

约束:字符串大小最大为 10^5,测试用例数量最大为 10^2。

注意:字符串可以包含大写或小写字母。

我为此编写了一个 c++ 程序。但它是给时间限制超出。对于较小的字符串,它运行良好。任何人都可以帮助我为此类问题提供实际和更好的逻辑。它也可以运行更大的字符串大小。

我的尝试:

#include <bits/stdc++.h>
 using namespace std;


int main() 

int t;
cin >> t;

while (t--)
 
    int n,i;
    cin >> n;

    string str;
    cin >> str;


    unsigned long long int 
  sum=0,pp;
    for(i=0;i<n;i++)
    
        if(str[i]=='a' || str[i]=='A' || str[i]=='e' || str[i]=='E' || str[i]=='i' || str[i]=='I' || str[i]=='o' || str[i]=='O' || str[i]=='u' || str[i]=='U')
        
            pp=(i+1)*(n-i);
            sum=sum+pp;
        

    

    cout <<sum << '\n';

【问题讨论】:

您能否准确解释一下您是如何得出结论的,即在字符串“coding”中,“字符 'o' 存在于 10 个子字符串中”?这 10 个子串是什么? 这个问题与 palindromes 有什么关系?为什么要求用户输入 n ? n 的目的是什么? Sir 'o' 出现在 co,od,odi,odin,oding,codi,coding,coding,o,cod 中。 在“codin”中。我必须打折你的两个“编码”之一。 虽然确实有 10 个包含 o 的子字符串和 12 个包含 i 的子字符串,但它们并不是完全不同的:例如odi 计入这两个总数。你应该计算这样的子串两次吗?当您将 10 和 12 相加并声明总数为 22 时,您就是这样做的。 【参考方案1】:

不要暴力破解。做一个组合功课。

提示 #1:长度为 n 的字符串具有 n*(n+1)/2 子字符串。

提示 #2:元音将原始字符串划分为一组辅音子字符串。长度为k 的辅音子串依次生成k*(k+1)/2 子串不应计算

这应该足以让你继续前进。

【讨论】:

以编码为例,子串总数为21,即n*(n+1)/2。现在一组分区辅音是 c, d, ng .so 由它们形成的子串总数是 1+1+3=5 所以至少有一个元音出现的子串数是 21-5 =16。但是先生,答案是 22。我解释你的第二个提示错了吗?

以上是关于字符串中的子字符串计数的主要内容,如果未能解决你的问题,请参考以下文章

如何用空格匹配、计数和替换字符串,但它们不是另一个字母字符串的子字符串?

子串计数问题

子串计数问题

子串计数问题

696. 计数二进制子串

最长公共子序列(计数问题)