H106OJ第二次练习:P1003
提示:本文章为课程任务(学习记录)
本文章为课程第一次练习习题记录,仅供参考。
问题描述
题目:
作为一名网络警察,你的任务是监视电子邮件,看其中是否有一些敏感的关键词。不过,有些狡猾的犯罪嫌疑人会改变某些单词的字母顺序,以逃避检查。请编写一个程序,发现这种调整过顺序的关键词。程序的输入有两行,第一行是关键词列表,第二行是待检查的句子。程序的输出为在该句子中所找到的经过顺序调整的关键词。(单词全部为小写,单词之间以一个空格分隔,每一行的单词个数不限)
输入:
第一行是关键词列表,第二行是待检查的句子。
输出:
经过顺序调整的关键词。(单词全部为小写,单词之间以一个空格分隔,每一行的单词个数不限)
样例:
输入:
guns mines missiles
aameric ssell snug dan iimsssle ot sit neeemis
输出:
guns missiles
思路:
首先要输入两行字符串并且,字符串中含有空格,想到了用getline,然后自己又查到了字符流istringstream的用法,思路为将输入的关键词进行排序,同时也将待检测的句子进行排序,一一对比,如果相同的话,则存在这个或多个关键词,我用了三个vector容器,分代存储,排序前的关键词、排序后的关键词,以及排序后的待检测的句子,代码如下:
代码:
#include<iostream>
#include<vector>
#include<sstream>
#include<algorithm>
using namespace std;
int main()
{
string m,n;
getline(cin, m);
getline(cin, n);
istringstream x(m);
vector<string>k;
vector<string>sk;
string t;
while(x>>t)
{
k.push_back(t);
sk.push_back(t);
}
vector<string>sortk;
istringstream y(n);
while (y>>t)
{
sortk.push_back(t);
}
for (int i = 0; i < sk.size(); i++)
{
sort(sk[i].begin(),sk[i].end());
}
for (int i = 0; i < sortk.size(); i++)
{
sort(sortk[i].begin(),sortk[i].end());
}
int cnt = 0;
for (int i = 0; i < sk.size(); i++)
{
for (int j = 0; j < sortk.size(); j++)
{
if (sortk[j] == sk[i])
{
if (cnt != 0)
cout << ' ';
cout << k[i];
cnt++;
}
}
}
return 0;
}
此次学到:stringstream是一个c++的输入输出控制类,它的作用是从string对象str中读取字符,必须包含#include < sstream> 这个头文件,istringstream(string str)。