使用 SET(C++) 检查两个给定字符串是不是为字谜时出现运行时错误
Posted
技术标签:
【中文标题】使用 SET(C++) 检查两个给定字符串是不是为字谜时出现运行时错误【英文标题】:Getting run-time error while USING SET(C++) to check if two given strings are anagrams使用 SET(C++) 检查两个给定字符串是否为字谜时出现运行时错误 【发布时间】:2018-09-09 18:21:59 【问题描述】:问题链接: https://www.hackerearth.com/practice/basic-programming/input-output/basics-of-input-output/practice-problems/algorithm/two-strings-4/
这些天我开始使用 set 和 map。 两个字符串 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】:尝试以更简单的方式解决它。问题是只有小写字符,每个单词只能使用一个频率数组,然后进行比较。
#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;
【讨论】:
【参考方案2】:这是因为您正在使用 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);
【讨论】:
以上是关于使用 SET(C++) 检查两个给定字符串是不是为字谜时出现运行时错误的主要内容,如果未能解决你的问题,请参考以下文章