在C ++中以递归方式查找字符串中的字符串

时间:2015-03-11 16:17:19

标签: c++ string recursion substring

(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;
}

这个功能出了什么问题?

6 个答案:

答案 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