使用 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++) 检查两个给定字符串是不是为字谜时出现运行时错误的主要内容,如果未能解决你的问题,请参考以下文章

使用 C++ 检查两个字符串是不是是字谜

如何在剃刀视图中检查模型字符串属性是不是为空

使用 Deque 检查给定字符串是不是为回文

使用数字格式检查给定字符串是不是为有效货币

是否有一些快速算法来检查两个字符串集中的子字符串

如何检查 C++ 字符串是不是为 int?