算法提高 P1003

1008: 算法提高 P1003

时间限制: 1 Sec  内存限制: 128 MB
提交: 6  解决: 2
[提交][状态][讨论版]

题目描述

作为一名网络警察,你的任务是监视电子邮件,看其中是否有一些敏感的关键词。不过,有些狡猾的犯罪嫌疑人会 改变某些单词的字母顺序,以逃避检查。请编写一个程序,发现这种调整过顺序的关键词。程序的输入有两行,第一行是关键词列表,第二行是待检查的句子。程序 的输出为在该句子中所找到的经过顺序调整的关键词。(单词全部为小写,单词之间以一个空格分隔,每一行的单词个数不限)

输入

guns mines missiles
aameric ssell snug dan iimsssle ot sit neeemi

输出

guns missiles

样例输入

guns mines missilesaameric ssell snug dan iimsssle ot sit neeemi 

样例输出

guns missiles

题目链接
点击打开链接
简单粗暴的方法,就是代码复杂。
#include<iostream>
#include<stdio.h>
#include<string.h>

using namespace std;

int main()
{
    int key[1000][26];  ///用来存放每个关键词的某个单词的个数
    int sen[26];  ///存放检索的句子中某个单词的个数
    char str1[1000];   ///存放第一个字符串
    char str2[1000];   ///存放第二个字符串
    char temp[1000][100];  ///存放关键词
    int a[1000];
    int i,j,k;
    while(gets(str1))
    {
        gets(str2);
        memset(a,0,sizeof(a));
        memset(key,0,sizeof(key));
        j=0;
        for(i = 0; i < strlen(str1); i++)  ///关键词
        {
            k = 0;
            while(str1[i]!=' '&&str1[i]!='\0')
            {
                temp[j][k]=str1[i];
                key[j][str1[i]-'a']++;
                i++;
                k++;
            }
            temp[j][k]='\0';
            j++;
        }
        for(i = 0; i < strlen(str2); i++)
        {
            memset(sen,0,sizeof(sen));
            while(str2[i]!=' '&&str2[i]!='\0')
            {
                sen[str2[i]-'a']++;
                i++;
            }
            for(k = 0; k < j; k++)
            {
                if(a[k]==0)
                {
                    int flag = 1;
                    for(int t1=0;t1<26;t1++)
                    {
                        if(key[k][t1]!=sen[t1])
                        {
                            flag = 0;
                            break;
                        }
                    }
                    if(flag)
                        a[k]=1;
                }
            }
        }
        for(i = 0;i < j; i++)
        {
            if(a[i])
            {
                printf("%s",temp[i]);
                break;
            }
        }
        i++;
        for(;i < j; i++)
        {
            if(a[i])
            {
                printf(" %s",temp[i]);
            }
        }
        printf("\n");
    }
    return 0;
}



  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值