(C ++) 给定myString,我想检查myString是否包含子字符串。这是我到目前为止所拥有的,但只有当字符串以子字符串开头时才返回true。
bool find(string myString, string substring)
{
if(mystring.length() < substring.length())
{
return false;
}
if(mystring == substring)
{
return true;
}
for(int i = 0; i < substring.length() - 1 ; ++i)
{
if(mystring.at(i) == substring.at(i))
{
continue;
}
else
{
string string2 = mystring.substr(1, mystring.length() - 1);
return find(string2, substring);
}
return true;
}
return false;
}
这个功能出了什么问题?
答案 0 :(得分:1)
在递归调用return
之前,您错过了find
。目前它最终会落到return false
。
另外,if (mystring == substring)
应检查mystring
是否以substring
开头,而不是完全相等。
答案 1 :(得分:1)
根据您的代码检查此功能,删除额外的代码并修复错误。
我还更改了签名以获取const引用以提高效率。
bool find(const string& myString, const string& substring)
{
if(myString.length() < substring.length()){
return false;
}
else if(myString.substr(0,substring.size()) == substring){
return true;
}
else if (myString.length() > substring.length()){
return find(myString.substr(1), substring);
}
else{
return false;
}
}
答案 2 :(得分:1)
首先,函数可以写得更简单。例如
bool find( const std::string &myString, const std::string &subString )
{
return
( myString.substr( 0, subString.size() ) == subString ) ||
( subString.size() < myString.size() && find( myString.substr( 1 ), subString ) );
}
这是一个示范程序
#include <iostream>
#include <iomanip>
#include <string>
bool find( const std::string &myString, const std::string &subString )
{
return
( myString.substr( 0, subString.size() ) == subString ) ||
( subString.size() < myString.size() && find( myString.substr( 1 ), subString ) );
}
int main()
{
std::cout << std::boolalpha << find( "Hello World", "World" ) << std::endl;
std::cout << std::boolalpha << find( "Hello C", "C++" ) << std::endl;
}
程序输出
true
false
至于你的函数,那么只有在两个字符串长度相同且彼此相等的情况下它才会返回
if(myString == substring){
return true;
}
万一myString.length()&gt; substring.length()函数不返回任何内容
else if (myString.length() > substring.length()){
int start = 1;
int end = (int) myString.length() - 1;
string string2 = myString.substr(start, end);
find(string2, substring);
}
我认为你的意思是
return find(string2, substring);
在此代码段中。
编辑:我看到您在帖子中更改了该功能的代码。但无论如何这个代码片段
for(int i = 0; i < substring.length() - 1 ; ++i)
{
if(mystring.at(i) == substring.at(i))
{
continue;
}
else
{
string string2 = mystring.substr(1, mystring.length() - 1);
return find(string2, substring);
}
return true;
}
毫无意义。
答案 3 :(得分:0)
首先,由于substr。
中的内存副本,这很昂贵其次,你没有检查子串长度&gt; 0.
第三,&#34;否则如果&#34;检查mystring.length&gt;如果您已完成其他检查(包括子字符串长度&gt; 0),则0是多余的。
现在到你的核心逻辑。在递归中,你的开始永远不会移动,所以你被束缚到了开头。你需要做的是从位置1开始,并在每次递归时递增开始,并使用substr从&#34; start&#34;中提取子串。 to&#34; start + substring.length&#34;。这样你从头开始,继续前进,并检查正确的长度。你也可以从最后开始(如你所愿)并向后移动,你需要做的是:找到sart位置(结束位置减去子串的长度),并在调用之前检查起始位置是否不小于零函数递归。
答案 4 :(得分:0)
您只需删除myString
最左侧的字符,然后将其余字符与substring
进行比较。显然,当substring
位于myString
的中间位置时,这不适用于一般情况。
在每次迭代尝试比较整个myString
,而不是它的第一个substring.size()
字符。这应该可以解决您的问题。
答案 5 :(得分:0)
这是我到目前为止所拥有的,但只有字符串才会返回true 从子串开始。
find("foo", "f")
也失败了。
要了解原因,请在函数中添加一些测试输出:
bool find(string myString, string substring)
{
std::cout << myString << ", " << substring << "\n";
// ...
}
它将打印:
foo, f
oo, f
o, f
你知道为什么这不起作用?你只需要删除第一个字符,直到只有最后一个字符与要找到的子字符串进行比较。
但即使是find("foo", "o")
:
foo, o
oo, o
o, o
这是因为这一行:
find(string2, substring);
您不会返回递归调用的结果。
考虑到所有事情,我认为你这里只有错误的算法。它根本无法按照您编写代码的方式工作。
其他一些观察结果:
int start = 1; int end = (int) myString.length() - 1;
这不是好风格。由于历史原因,std::string
的大小是未签名的,并且您使用的是C样式广播,其中static_cast
应该是首选。你应该在这里使用std::string::size_type
,因为它只是一个内部的实现代码,你不会从转换到int
获得任何东西。
string string2 = myString.substr(start, end);
substr
的第二个参数定义子字符串的长度,而不是最后一个字符的索引。 end
听起来像是使用该值作为最后一个字符的索引。看看http://en.cppreference.com/w/cpp/string/basic_string/substr。