首页 > 其他 > 详细

检查string是否有重复尝试用map

时间:2020-05-07 16:32:14      阅读:54      评论:0      收藏:0      [点我收藏+]

链接:

题意:输入一些单词,找出所有满足如下条件的单词:该单词不能通过字母重排,得到输入文本的另外一个单词。在判断是否满足条件时,字母不分大小写,但在输出时应保留输入的大小写,按字典序排列。

题解:先对输入的单词进行小写化,然后进行排序,如果排序后的字符串相同,那么就剔除。此处建议用map<string,int>类型 注(map中的int会自动初始化为0)

ac代码:第一种:结构体加两个for循环,不建议,代码长又复杂度高(n*n)

#include<iostream>
#include<set>
#include<string>
#include<algorithm>
#include<vector>
#include<sstream>
using namespace std;
struct str
{
    string s,ss;
    int flag=0;
};
void zu(str &S)
{
    S.ss=S.s;
    for(int i=0; S.ss[i]!=0; i++)
        S.ss[i]=tolower(S.ss[i]);
    int len=(S.ss).size();
    sort((S.ss).begin(),(S.ss).end());
}
int main()
{
    vector<string>vec;
    str strin[5500];
    int k=0;
    string sw;
    while(cin>>sw)
    {
        if(sw=="#") break;
        k++;
        strin[k].s=sw;
        zu(strin[k]);
    }
    for(int i=1; i<=k; i++)
    {
        for(int j=i+1; j<=k; j++)
            if(strin[j].flag==0&&strin[i].ss==strin[j].ss)
            {
                strin[j].flag=1;
                strin[i].flag=1;
            }
    }
    for(int i=1; i<=k; i++)
        if(strin[i].flag==0)
            vec.push_back(strin[i].s);
    sort(vec.begin(),vec.end());
    for(vector<string>::iterator it=vec.begin(); it!=vec.end(); it++)
        cout<<*it<<endl;
    return 0;
}

改进后用map统计(复杂度仅为k*n)
#include<iostream>
#include<string>
#include<vector>
#include<map>
#include<algorithm>
using namespace std;
map<string,int> m;
vector<string>k;
vector<string>ans;
string zu(string ss)
{
    string s=ss;
    for(int i=0;s[i]!=0;i++)
        s[i]=tolower(s[i]);
    sort(s.begin(),s.end());
    return s;
}
int main()
{
    string s;
    while(cin>>s)
    {
        if(s=="#") break;
        k.push_back(s);
        string r=zu(s);
        m[r]++;
    }
    for(vector<string>::iterator it=k.begin();it!=k.end();it++)
    {
        if(m[zu(*it)]==1) ans.push_back(*it);
    }
    sort(ans.begin(),ans.end());
    for(vector<string>::iterator it=ans.begin();it!=ans.end();it++)
    {
        cout<<*it<<endl;
    }
    return 0;
}


检查string是否有重复尝试用map

原文:https://www.cnblogs.com/Joe2019/p/12843752.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!