Получение ошибки времени выполнения при использовании SET (C ++), чтобы проверить, являются ли две данные строки анаграммами - PullRequest
0 голосов
/ 09 сентября 2018

Ссылка на проблему: https://www.hackerearth.com/practice/basic-programming/input-output/basics-of-input-output/practice-problems/algorithm/two-strings-4/

Я начал с сет и карты в эти дни. Две строки str1 и str2 имеют одинаковую длину. Я должен сказать, являются ли они анаграммами друг друга. Я использовал unordered_map, чтобы решить проблему, поддерживая количество символов, которое работает за линейное время и отлично работает. Но я хочу использовать unordered_multiset, но получаю ошибку во время выполнения.

Код:

#include<bits/stdc++.h>
using namespace std;
int main(){ 
int t;// number of testcases
cin>>t;
while(t--){
    string str1,str2;// two strings of equal length str1 and str2
    cin>>str1>>str2;
    unordered_multiset<char> s1,s2;// two sets 
    for(int i=0;i<str1.length();i++){
        s1.insert(str1[i]);// initialization
        s2.insert(str2[i]);
    }
    unordered_multiset<char>::iterator itr;
    for(itr=s1.begin();itr!=s1.end();itr++){
        if(s2.find(*itr)!=s2.end()) s2.erase(itr);/*  if *itr is present in s2 then delete its address .....
                                                    i know i am making mistake somewhere here but i can't figure out*/
        else {
            cout<<"NO"<<"\n";// print NO if not found
            break;
        }
    }
    if(itr==s1.end()) cout<<"YES"<<"\n";// if itr reached the end print YES
}
}

Идея состоит в том, чтобы перебрать множество s1 и найти соответствующий элемент в множестве s2. Если не найдено, выведите NO и прервите прерывание, в противном случае удалите соответствующий элемент из s2, и поскольку я использую итератор для удаления элементов, поэтому при наличии нескольких вхождений символа 1-е вхождение следует удалить.

пожалуйста, дайте мне знать, если вы не получили мой вопрос

Ответы [ 2 ]

0 голосов
/ 15 октября 2018

Попробуйте решить это более простым способом. Проблема состоит в том, что есть только строчные символы, вы можете использовать только частотный массив для каждого слова, а затем сравнить его.

#include <bits/stdc++.h>
using namespace std;
int main()
{
    int t;
    cin >> t;
    while(t--)
    {
        vector<int> f1(26, 0);
        vector<int> f2(26, 0);
        string s1, s2;
        cin >> s1 >> s2;
        for(const char& c : s1) f1[c - 'a']++;
        for(const char& c : s2) f2[c - 'a']++;
        cout << ( (f1 == f2)? "YES" : "NO") << endl;
    }
}
0 голосов
/ 09 сентября 2018

Это потому, что вы используете итератор из s1 для удаления элемента из s2:

if(s2.find(*itr)!=s2.end()) s2.erase(itr);

Это должно быть так:

if(s2.find(*itr)!=s2.end()) s2.erase(*itr);

или

auto elem = s2.find(*itr);
if (elem != s2.end())
   s2.erase(elem);
...