手机号查询

题目:
信服君接受一项任务需要制作一个手机号码查询系统,输入连续的数字后,需要显示所有包含该连续数字的手机号。为了验证算法,信服君当前只需输出手机号的个数即可。

注:直接用数学的查找方式如果(phonenum [i] .find(test)!= string :: npos)会超时,只能AC80%,这里用空间替换时间效率AC了100%。的连续组合方式,从而节省了找到的时间。

#include<bits/stdc++.h>
using namespace std;
int main(){
    int i,j,n,q;
    unordered_map<string,int>m;//用于记录连续数字出现的数字,key=连续数字,value=次数
    cin>>n>>q;//n个手机号码,q个查询数字段
    unordered_set<string>phone;//用set进行存储避免了号码的重复插入
    string s;
    while(n--){        
        cin>>s;
        if(s.size()!=11)continue;//不是正确的电话号码则不必存储
        phone.insert(s);//用set进行插入,避免号码的重复
    }    
    for(unordered_set<string>::iterator it=phone.begin();it!=phone.end();++it){
        s=*it;
        unordered_set<string>c;
            for(i=0;i<11;++i){
                string t;
                for(j=i;j<11;++j){
                    t+=s[j];
                    c.insert(t);//将一个手机号码所有的连续组合方式进行存储,用空间替换时间
                }
            }
            for(auto p:c)m[p]++;//计数
    }    
    while(q--){
        cin>>s;//输入连续数字段
        cout<<m[s]<<endl;//输出他的次数
    }
    return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值