K - Ananagrams

本文介绍了一种算法,用于从输入的单词列表中筛选出那些无法通过重新排列字母形成列表内其他单词的独特单词。该算法利用了C++标准库中的数据结构如vector、map和set,通过对单词进行小写转换及排序后作为map的键值来计数,最终筛选出仅出现一次的独特单词。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

输入一些单词,找出所有满足下列条件的单词;该单词不能通过重排变为输入文本的其他单词。判断时字母不分大小写,但在输出时应该保留大小写,并按字典序输出;


在进行文本输入时,每输入一个单词将他放到vector,同时开一个map,用输入的单词作key,出现的次数作为value,当然作为key的单词要先经过处理,将它小写化并按字典序排序,然后再放入key中,这样文本输完后,原始文本保存在vector中,map存放了每个标准化单词出现的次数;然后再遍历vector,将每一个单词同过map来判断是否只出现一次,如果是,则该单词是满足条件的,然后放入集合中。最后再遍历输出集合就是答案;  


#include <iostream>
#include <string>
#include <cstdio>
#include <cstring>
#include <set>
#include <map>
#include <sstream>
#include <algorithm>
#include <vector>
using namespace std;
string stad(string s)
{
    for(int i=0;i<(int)s.length();i++)s[i]=tolower(s[i]);
    sort(s.begin(),s.end());
    return s;
}
int main()
{
    string s;map<string,int>st;vector<string>word;//freopen("1.txt","r",stdin);
    while(cin>>s)
    {
        if(s[0]=='#')break;
        word.push_back(s);
        string pre=stad(s);
        if(!st.count(pre))st[pre]=0;
        st[pre]++;
    }
    set<string>as;
    for(int i=0;i<(int)word.size();i++)
    {
        if(st[stad(word[i])]==1)as.insert(word[i]);
    }
    for(set<string>::iterator it=as.begin();it!=as.end();++it)
        cout<<*it<<endl;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值