Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/228.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
返回字符串的所有子字符串的递归函数 我需要在C++中实现一个函数, vector<string> generateSubstrings(string s), 向量生成子字符串(字符串s),_C++_String_Recursion_Vector_Substring - Fatal编程技术网

返回字符串的所有子字符串的递归函数 我需要在C++中实现一个函数, vector<string> generateSubstrings(string s), 向量生成子字符串(字符串s),

返回字符串的所有子字符串的递归函数 我需要在C++中实现一个函数, vector<string> generateSubstrings(string s), 向量生成子字符串(字符串s),,c++,string,recursion,vector,substring,C++,String,Recursion,Vector,Substring,返回字符串的所有子字符串的向量。例如,字符串“rum”的子字符串是七个字符串 “r”、“ru”、“rum”、“u”、“um”、“m”、“u” 函数必须是递归的,并且必须以向量形式返回结果 这是到目前为止我的代码。它只打印“r”、“ru”和“rm”。我在实现这个功能时遇到了很多问题。在过去的几个小时里,我一直在研究这个问题,但我就是不知道如何让它按规定工作,所以任何帮助都将不胜感激 #include <iostream> #include <string> #include

返回字符串的所有子字符串的向量。例如,字符串“rum”的子字符串是七个字符串

“r”、“ru”、“rum”、“u”、“um”、“m”、“u”

函数必须是递归的,并且必须以向量形式返回结果

这是到目前为止我的代码。它只打印“r”、“ru”和“rm”。我在实现这个功能时遇到了很多问题。在过去的几个小时里,我一直在研究这个问题,但我就是不知道如何让它按规定工作,所以任何帮助都将不胜感激

#include <iostream>
#include <string>
#include <vector>

using namespace std;

vector<string> generateSubstrings(string s, int num){ 
    int index = num;
    int SIZE = s.size();

    vector<string> substrings;


    if(index == s.size()){//BASE CASE
        string temp = s.substr(index,1);
        substrings.push_back(temp);
    }
    else{
        for(int i = 0; i < SIZE; ++i){ 
            string temp = s.at(index) + s.substr(i,i);
            substrings.push_back(temp);
        }   
        generateSubstrings(s, num + 1);
    }     
    return substrings; 
} 

int main() { 
    vector<string> vec(20);
    vec = generateSubstrings("rum", 0);


    cout << endl << endl;cout << "PRINTING VECTOR" << endl;

    for ( int i = 0; i<vec.size();++i){
        cout << vec.at(i);
        cout << endl;
    }
    cout << "DONE";
}
#包括
#包括
#包括
使用名称空间std;
向量生成子字符串(字符串s,int num){
int index=num;
int SIZE=s.SIZE();
向量子串;
if(index==s.size()){//基本大小写
字符串温度=s.substr(索引,1);
子串。推回(温度);
}
否则{
对于(int i=0;icout这里有一个使用Python的答案。它为“rum”打印正确的结果,但为“rumm”打印两个“m”子字符串,原因很明显:

def substrings(s):
  result = []
  if len(s) == 0:
    result.append("")
  if len(s) > 0:
    result += substrings(s[1:])
  for n in range(1,len(s)+1):
    result.append(s[0:n])
  return result

print substrings("rum")

print substrings("rumm")
该算法的思想是:对于“rum”,子串是“um”的子串,后跟“r”、“ru”和“rum”。对于“um”,子串是“m”的子串,后跟“u”和“um”。对于“m”,子串是“m”的子串,后跟“m”。对于“m”,子串是简单的。因此,最后的列表是“m”、“u”“嗯”、“r”、“ru”、“朗姆酒”


虽然这不是C++,但是你应该能够把代码翻译成C++。但是这可能不是你想要的,因为“Runm”有两个“M”子串。如果你认为“Rimm”应该只有一个“M”。substring,请留下评论,我将发布另一个答案。

在您的作业中,有这样的说明,递归函数必须声明为

vector<string> generateSubstrings(string s),
vector<string> generateSubstrings(string s, int num);
如果您还需要包含一个空字符串,那么您应该更改条件

    if ( s.empty() ) return {};
以适当的方式。例如

   if ( s.empty() ) return { "" };
#include <iostream>
#include <string>
#include <vector>

std::vector<std::string> generateSubstrings( std::string s )
{
    if ( s.empty() ) return {};

    std::vector<std::string> v;
    v.reserve( s.size() * ( s.size() + 1 ) / 2 );

    for ( std::string::size_type i = 0; i < s.size(); i++ )
    {
        v.push_back( s.substr( 0, i + 1 ) );
    }

    std::vector<std::string> v2 = generateSubstrings( s.substr( 1 ) );

    v.insert( v.end(), v2.begin(), v2.end() );

    return v;
}

int main() 
{
    std::string s( "rum" );

    for ( const std::string &t : generateSubstrings( s ) )
    {
        std::cout << t << std::endl;
    }

    return 0;
}
在这种情况下,你也应该写

   v.reserve( s.size() * ( s.size() + 1 ) / 2 + 1 );
您还可以使用方法insert替换所示函数中的循环

   if ( s.empty() ) return { "" };
#include <iostream>
#include <string>
#include <vector>

std::vector<std::string> generateSubstrings( std::string s )
{
    if ( s.empty() ) return {};

    std::vector<std::string> v;
    v.reserve( s.size() * ( s.size() + 1 ) / 2 );

    for ( std::string::size_type i = 0; i < s.size(); i++ )
    {
        v.push_back( s.substr( 0, i + 1 ) );
    }

    std::vector<std::string> v2 = generateSubstrings( s.substr( 1 ) );

    v.insert( v.end(), v2.begin(), v2.end() );

    return v;
}

int main() 
{
    std::string s( "rum" );

    for ( const std::string &t : generateSubstrings( s ) )
    {
        std::cout << t << std::endl;
    }

    return 0;
}
#包括
#包括
#包括
std::vector生成子字符串(std::字符串s)
{
if(s.empty())返回{};
std::向量v;
v、 储备(s.size()*(s.size()+1)/2);
对于(std::string::size_type i=0;istd::cout首先,您应该注意代码缩进。
然后,我不看你的代码,我写了一些代码来实现你的目标,如下所示:

void generateSubstrings(string s, int num, vector<string> &sta)
{
    if (num == s.size())
        return;

    auto b = begin(s) + num;

    string temp = "";
    temp += *b;
    sta.push_back(temp);
    b++;
    while (b != end(s))
    {

        temp += *b;
        sta.push_back(temp);
        b++;

    }
    generateSubstrings(s, num + 1, sta);
}
void生成子字符串(字符串s、int-num、vector和sta)
{
如果(num==s.size())
返回;
自动b=开始+数量;
字符串temp=“”;
温度+=*b;
sta.推回(温度);
b++;
而(b!=结束)
{
温度+=*b;
sta.推回(温度);
b++;
}
生成子字符串(s,num+1,sta);
}

rumm的子字符串是什么?它有两个“m”吗子串还是应该只有一个?这个问题显然是用C++来标记的,所以不是发布Python代码,而是应该把正确的算法发布出来。不能保证OP知道Python。你是对的。现在我在解释字符串RUM的用例时解释算法的思想。但是,我必须指出,Python实际上是可执行的伪代码,通过用Python回答,除了我可以验证算法工作的好处之外,我还有一个好处,那就是答案很容易理解。我有一个问题,当你为(const std::string&t:generateSubstrings)做
,是否每次都对
生成子字符串进行求值?@Guiroux它只求值一次。我一直收到一个错误,说,“引用变量“t”需要一个初始值设定项。”我不知道如何解决这个问题,因为我不熟悉用于循环的语法。此语法是C++11标准,必须使用-std=C++11选项用于循环的g++example@Domino使用该函数的第二次修改。它不使用基于范围的for循环。至于main中的循环,则可以不使用循环。:)此代码与问题中的代码有什么不同?请添加解释,以便其他用户可以从此答案中受益。此答案已标记为“非常低质量”,因此,请对其进行改进。
void generateSubstrings(string s, int num, vector<string> &sta)
{
    if (num == s.size())
        return;

    auto b = begin(s) + num;

    string temp = "";
    temp += *b;
    sta.push_back(temp);
    b++;
    while (b != end(s))
    {

        temp += *b;
        sta.push_back(temp);
        b++;

    }
    generateSubstrings(s, num + 1, sta);
}