检查两个字符串c++中是否有一个公共子字符串
To check if there is a common substring in 2 strings c++
我已经制定了一个解决方案,但我需要一个优化的解决方案。任务是:
- 读取两个字符串
- 获取第一个字符串的每个子字符串,并在第二个字符串中找到每个子字符串
- 如果存在,则打印"是"或"否"
我已经制定了解决方案:
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),否则就没有公共子串。
除了优化的解决方案外,您的代码还有其他问题。例如,并非所有代码路径都返回一个值。
最有效的解决方案取决于许多因素,包括两个字符串的大小、两个字符串匹配的程度等。
在没有这些信息的情况下,我建议您可以使用:
- 从第二个字符串创建trie
- 从第一个字符串创建后缀数组
- 使用后缀数组生成第二个字符串的所有子字符串。同时检查其是否存在于步骤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
中的任何符号。
相关文章:
- 我有一个返回字符串向量的函数.它需要两个字符串,并且返回一个字符串中缺少的字符串
- 对于C字符串,是否有一个标准的C++迭代器
- 我有一个字符串变量单词= "APA"
- 从 c++ 库中获取一个字符串,周围有一个 java 包装器
- C++从文件中读取不同类型的数据,直到有一个以数字开头的字符串
- 删除指向排序的字符串阵列的指针会在运行后会有一个错误
- 指针怎么能有一个字符串作为它的值
- 我有一个构造函数,但我需要将输出返回到 main.cpp.我无法使用获取字符串功能!!任何想法如何实现这一目标?
- 从C 中的线路读取(每行都有一个字符串和几个INT值)
- 如何验证字符串是有效的双精度(即使它有一个点)
- 从.txt文件中读取多个数据类型,其中一个字符串有空格C++
- C++中是否有一个std::string的内置函数,当两个字符串都可以是大写或小写时,可以按字母顺序比较两个字符串
- 当我有一个给出数组的函数时,如何返回一个字符串
- 在系统()中有一个字符串
- 是否有一个库可以生成一个字符串,该字符串将散列(SHA1)到给定的输入
- 检查两个字符串c++中是否有一个公共子字符串
- 如果我有一个字符串向量,如何使用带execvp的字符串来执行命令
- 有一个不匹配的字符串的算法
- 从文件中读取数据,该文件每行都有一个字符串,其中可能有也可能没有整数
- C++:是否有一个包含各种函数的traits类来操作以零结尾的char*和wchar_t*字符串