【问题标题】:To check if there is a common substring in 2 strings c++检查2个字符串c ++中是否存在公共子字符串
【发布时间】:2016-03-27 07:26:02
【问题描述】:

我已经制定了解决方案,但我需要一个优化的解决方案。任务是:

  1. 读取两个字符串
  2. 获取第一个字符串的每个子字符串并在第二个字符串中找到每个子字符串
  3. 如果存在,打印“是”,否则打印“否”

我已经提出的解决方案:

int check(string A, string B)
{ 
    string s3;
    int flag=0 ,len1,len2,k=0;
    s3[0]='\0';
    cin>>A>>B;
    len1=A.length();
    len2=B.length();

    for(int i=0;i<len1;i++)
    {
        k=len1-i;

        for(int j=1;j<k;j++ )
        {
            s3=A.substr(i,j);

            size_t found=B.find(s3);

            if(found!=string::npos)
            { 
                flag=1;
                return flag;
            }

        } 
    }
}

【问题讨论】:

  • 在此处粘贴代码时,请保持/使格式(缩进)正确,以便代码可读。
  • 所需的最小公共子串长度是多少?我们可以说一个共同的字符是共同的 somestring
  • 你试过搜索“最长公共子串问题”吗?
  • 如果子字符串没有长度限制,那么你可以一直打印 yes,因为空字符串是所有字符串对的公共子字符串。
  • 没有必要检查所有可能的子字符串(O(n^2)),因为如果一个子字符串对两个字符串都是公共的,那么它的所有子字符串也是公共的(即使是单个字符)。因此,只检查常见字符就足够了。

标签: c++ string algorithm find substring


【解决方案1】:
bool check(const std::string & a, const std::string & b) {
   return b.find_first_of(a) != std::string::npos;
}

你看,如果字符串b 不包含来自a 的大小为1 的子字符串,它就不能包含以相同符号开头的更大子字符串。所以你基本上只需要检查字符串b是否包含字符串a中的任何符号。

【讨论】:

  • 您可以通过调用std::string::find_first_of来替换其中的大部分内容
  • 谢谢!!这与我的代码一起工作,时间更短!什么是 find_first_of(a) 的复杂度?
  • 地图仍然是一个优化的解决方案?
  • @sindhuja 很大程度上依赖于std::string::find_first_of 的实现。
【解决方案2】:

除了优化解决方案之外,您的代码还有其他问题。 例如,并非所有代码路径都返回一个值。

最有效的解决方案取决于多个因素,包括两个字符串的大小、两个字符串的匹配程度等。

如果没有这些信息,我建议您可以使用:

  1. 从第二个字符串创建trie
  2. 从第一个字符串创建suffix array
  3. 使用后缀数组生成第二个字符串的所有子字符串。在第 1 步中创建的 trie 中与生成一起检查其是否存在。

您可以考虑的其他方法包括修改rabin karp,这应该不难弄清楚。

【讨论】:

  • 请给我一些我的代码失败的例子..但是要检查 2 个字符串是否有一个共同的子字符串.. 我需要 nt 生成所有子字符串的仪式吗?
  • 获取第一个字符串的每个子字符串,并在第二个字符串中找到每个。在您的问题中,您提到 eachevery 这意味着所有子字符串。
  • 好的!我在我的程序中做了什么!!我得到了所有子字符串并检查了!但这需要太多时间!为了找到常见的子字符串,我只需要检查第二个字符串的第一个字符是否在 te 1st 中!感谢您对 trie 的想法......会检查一下!!
【解决方案3】:

将第一个字符串的所有字符放入一个哈希集(unordered_set),然后迭代第二个字符串的字符并检查其中是否存在于哈希集中。如果是,则存在公共子串(长度至少为 1),否则,不存在公共子串。

【讨论】:

  • (在获取字符串长度很便宜的环境中,使用较短的字符串来填充集合。)
  • 这是一个更好的解决方案!谢谢!!地图是一种优化的解决方案.. o(1) : 用于插入和搜索!!
  • @sindhuja 实际上是 o(log(n)),而不是 o(1)
  • @V.Kravchenko 好吧!! ` int check(string A, string B) return B.find_first_of(A) != std::string::npos; ` 这是优化代码还是带有地图的代码?
  • @sindhuja 地图搜索和插入是 o(log(n)),但不是 o(1)。
猜你喜欢
  • 1970-01-01
  • 2012-09-28
  • 1970-01-01
  • 2011-02-07
  • 1970-01-01
  • 2012-05-03
  • 1970-01-01
  • 1970-01-01
  • 2021-12-20
相关资源
最近更新 更多