【发布时间】:2019-03-26 11:22:46
【问题描述】:
给定一个字符串和一个子字符串,以及起点和终点的索引,我希望能够找到该子字符串在边界内出现的次数。例如,给定字符串“ACACTACG”,我想从 3 到 7 中找到子字符串“AC”的出现次数(如果第一个索引是 1)。上面的示例产生输出 2。从 3 到 7,我们有“ACTAC”,其中子字符串“AC”出现了 2 次。我似乎无法用 C++ 编写代码;
这是 AtCoder Beginner Contest 122 的问题 C:https://atcoder.jp/contests/abc122/tasks/abc122_c
我确实设法编写了此代码,但超出了时间限制。我需要一种更简单的方法。
这是我提交的 TLE 结果:
#include <iostream>
using namespace std;
int main()
{
int N, Q;
string s;
cin >> N >> Q >> s;
for(int i = 0; i < Q; i++)
{
int l, r;
cin >> l >> r;
if(l >= r)
{
cout << 0 << endl;
break;
}
int count = 0;
for(int j = l - 1; j < r; j++)
{
if(s[j] == 'A' && s[j + 1] == 'C' && j != r - 1)
{
count++;
j++;
}
}
cout << count << endl;
}
return 0;
}
在做了一些数学运算后,我发现我得到 TLE 的原因是因为我的代码大约有 10^10 条指令,而 2 秒的时间限制只能执行大约 2 * 10^8 条指令。
【问题讨论】:
-
如果您 100% 确定代码可以正常工作,那么您似乎想要的是应该发布在 codereview.stackexchange.com 上的代码审查。但请先确保on-topic 在那里。
-
请给你的变量起有意义的名字,这样更容易阅读和理解你的代码,同时也降低了难以检测到错误的风险,例如由于
l、I和1看起来相似等原因导致的复制粘贴错误、拼写错误或简单疏忽。int numberOfFoobars;比int N;好很多。 -
我的错。对那些错误感到抱歉。这是我第一次问这样的问题哈哈哈
标签: c++ string algorithm substring