这个功能怎么了?它没有显示错误,但始终将输出设为0

时间:2019-06-12 06:41:11

标签: c++ string function vector

如果一个字符串可以通过从另一个字符串中删除0个或多个字符来形成,则该字符串被称为另一个字符串的子代。给定两个长度相等的字符串,那么可以构造为最长的字符串的最长字符串是什么?

例如,ABCD和ABDC有两个最大长度为3的子代ABC和ABD。它们可以通过消除两个字符串中的D或C来形成。请注意,我们不会将ABCD视为普通孩子,因为我们无法重新排列字符和ABCD ABDC。

commonChild具有以下参数:

s1,s2:两个相等长度的字符串

打印最长的字符串的长度,使之成为两个字符串的子代。

样本输入

HARRY
SALLY

示例输出

2

我使用矢量函数编写了以下函数。

int commonChild(string s1, string s2) {

    vector <char> v1; vector <char> v2; vector <char> v3;
    for(int i=0;i<s1.size();i++)
    {
        v1.push_back(s1[i]);
    }

    for(int j=0;j<s2.size();j++)
    {
        v2.push_back(s2[j]);

    }

    set_intersection(v1.begin(),v1.end(),v2.begin(), v2.end(), v3.begin());
    return(v3.size());
}

它没有显示错误。但输出始终为0。出了什么问题?

2 个答案:

答案 0 :(得分:0)

您的问题在这里:

set_intersection(v1.begin(),v1.end(),v2.begin(), v2.end(), v3.begin());
                                                           ^
                        This iterator is invalid ----------+

v3向量为空,并且将v3.begin()用作set_intersection()的输出迭代器是无效的。

替换为back_inserter(v3),以获得将元素插入v3的输出迭代器。

set_intersection(v1.begin(),v1.end(),v2.begin(), v2.end(), back_inserter(v3));

看到它运行there

参考文献:

注释

  • 我只解决您的问题。这并不意味着这是您的代码中唯一的问题。
  • set_intersection可能不是这里的正确工具。

答案 1 :(得分:0)

您遇到许多问题。

首先,您无法通过vectoriterator添加元素,因此v3.begin()不是std::set_intersection的合适输入。对于d_first的{​​{1}}参数,可以以非空的set_difference开头,也可以使用std::back_inserter

第二,std::set_intersection需要排序的输入,而您的样本输入则不需要。对输入进行排序会给函数带来不同的含义。

第三,虽然没有错,但将v3复制到std::string毫无意义。 std::vector<char>是容器类型。