检查两个字符串c++中是否有一个公共子字符串

To check if there is a common substring in 2 strings c++

本文关键字:字符串 有一个 是否 c++ 两个 检查      更新时间:2023-10-16

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

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

我已经制定了解决方案:

int check(string A, string B)
{ 
    string s3;
    int flag=0 ,len1,len2,k=0;
    s3[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;
            }
        } 
    }
}

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

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

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

在没有这些信息的情况下,我建议您可以使用:

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

你可以考虑的其他方法包括修改rabin karp,这应该不难理解。

bool check(const std::string & a, const std::string & b) {
   return b.find_first_of(a) != std::string::npos;
}

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

相关文章: