что не так с этой функцией?ошибка не отображается, но выводит 0 - PullRequest
0 голосов
/ 12 июня 2019

Строка называется дочерней по отношению к другой строке, если она может быть сформирована путем удаления 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 голосов
/ 12 июня 2019

У вас есть ряд проблем.

Во-первых, вы не можете добавлять элементы в vector через iterator, поэтому v3.begin() не подходит для std::set_intersection. Для параметра d_first set_difference либо начните с непустого v3, либо используйте std::back_inserter.

Во-вторых, std::set_intersection требует отсортированного ввода, а ваш ввод сэмпла - нет. Сортировка вашего ввода придаст вашей функции другое значение.

В-третьих, хотя и не ошибочно, копировать std::string в std::vector<char> бессмысленно. std::string это тип контейнера.

0 голосов
/ 12 июня 2019

Ваша проблема здесь:

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));

См. его запуск там .

Ссылки:

Примечания

  • Я отвечаю только на ваш вопрос,Это не значит, что это единственная проблема в вашем коде.
  • set_intersection , вероятно, здесь не тот инструмент.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...