【问题标题】:Optimize an algorithm to find multiple specific substrings of a string优化算法以查找字符串的多个特定子字符串
【发布时间】:2021-11-08 18:45:31
【问题描述】:

我是 C++ 编码新手,刚开始解决竞争性编程问题。我想解决以下任务:https://onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=1620.
我想找到一个字符串的子字符串。问题是下面的代码很慢,我通过收到“time limit exceeded”“错误”导致提交失败。我可以做些什么来加快代码速度?

#include <iostream>
#include <sstream>
#include <stdio.h>
#include <string.h>

using namespace std;

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);

    stringstream ss;
    string m;
    char prob[100000];
    char substring[1000];
    int howManyCases = 0;
    int numberOfTests = 0; 

    cin >> numberOfTests;
    cin.ignore();
    while(numberOfTests--)
    {
        cin >> prob >> howManyCases;

        while(howManyCases--)
        {
            cin >> substring;
            if (strstr(prob,substring)) {
                ss << 'y' << "\n";
            }
            else
            {
                ss << 'n' << "\n";
            }
        }
    }

    m = ss.str();
    cout << m;

    return 0;
}

【问题讨论】:

  • 我可以做些什么来加快代码速度? -- 报废代码,研究Boyer-Moore等算法。
  • 您的字符数组太小。当 prob1000 的输入为 100000 个字符以找到子字符串时,这些数组中没有空终止符的空间。然后调用 strstr 会导致未定义的行为。一种可能性是strstr 一直循环,因为它找不到字符串的终止符。我不会打赌,但仅此一项就可以解释为什么你会超时
  • std::search。第二件事是,您从那些竞争性编程网站获得的问题的措辞是这样的,因此总会有一种天真的方法来回答问题(例如您的尝试)。问题是这种简单的方法很容易编写,但由于超时和/或输入大小几乎总是会失败。这些问题的目的是看看您是否可以进行研究以找到非天真的解决方案,即使用更好的搜索算法,例如我已经提到的那些。
  • fwiw,我在上述评论中的结论是错误的。 cin &gt;&gt; prob 不会将“太多”字符读入数组并且不会有 UB,但无论如何您的数组都太小了 1 个字符

标签: c++ optimization substring


【解决方案1】:

我会让你成为&lt;algorithm&gt; 标题:

std::string parent_string = "some string lala";
std::string sub_string = "lala";
auto found = parent_string.find(sub_string);

它将迭代器返回到子字符串所在的位置。然后我会使用这个子句:

if (found != std::string::npos) std::cout << "y\n";
else std::cout << "n\n";

如果对标准库的使用没有限制,使用它总是比创建自己的算法(可能无法处理一些你不会想到的特殊情况)更好的选择。 另外,将那些丑陋的c-style arrays 换成std::string

【讨论】:

  • 你为什么希望它比strstr 快?
猜你喜欢
  • 2015-02-13
  • 1970-01-01
  • 2013-04-14
  • 1970-01-01
  • 1970-01-01
  • 2016-01-18
  • 1970-01-01
  • 1970-01-01
  • 2018-08-17
相关资源
最近更新 更多