用c ++生成子串

时间:2016-09-06 19:36:28

标签: c++ algorithm

我试图生成fun这个词的所有子串。

但它打印" un"两次,我不知道为什么。

int c, i;
    string s = "fun";
    for (c = 0; c < s.length(); c++)
    {
        for (i = c+1; i <= s.length(); i++)
        {
            string d = s.substr(c, i);
            cout << d << endl;
        }
    }

2 个答案:

答案 0 :(得分:1)

substr的第二个参数是长度,而不是子字符串的结尾index

您可以使用以下逻辑获取所有子字符串:

  • 从索引0开始,选择长度为1的子字符串,然后选择长度为2的子字符串,然后选择3,依此类推
  • 然后转到索引1并对其执行相同操作,依此类推。 (在索引1时,如果是2,则字符串的剩余长度为fun,因此我们必须运行循环直到2 })

    string s = "fun";
    for (int c = 0; c < s.length(); c++)
    {
        for (int i = 1; i <= s.length() - c; i++)
        {
            string d = s.substr(c, i);
            cout << d << endl;
        }
    }
    

答案 1 :(得分:0)

  

但它打印“un”两次,我不知道为什么。

你可以找到为什么如果你打印c和我

    ...
    for (i = c+1; i <= s.length(); i++)
    {
        cout << "c,i: " << c << i << endl; // add this line to debug !
        string d = s.substr(c, i);
        ...

输出:

c,i: 01
f
c,i: 02
fu 
c,i: 03
fun
c,i: 12
un
c,i: 13
un
c,i: 23
n

请注意,如果 i 比字符串中的其余字符长,则 c 之后,substr将只添加尽可能多的char,{{3} }

  

要包含在子字符串中的字符数(如果字符串更短,则使用尽可能多的字符)。