Ссылка на проблему: 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 и break, в противном случае удалите соответствующий элемент из s2, и поскольку я использую итератор для удаления элементов, поэтому, если существует несколько вхождений символа, то первое вхождение следует удалить.
пожалуйста, дайте мне знать, если вы не поняли мой вопрос
Это потому, что вы используете итератор из 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);
Попробуйте решить ее попроще. Проблема заключается в том, что есть только символы нижнего регистра, вы можете использовать только частотный массив для каждого слова, а затем сравнивать его.
#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;
}
}
Простейшая проверка анаграммы - это сортировка строк и их последующее сравнение. Буквально три строчки кода.