给定一个英文段落(包含 n 个句子)和 m 次查询,每次给定一个句子,求段落中相同单词数量最多的句子。各个英文句子不包含标点,大小写不敏感。
#include<iostream>
#include<vector>
#include<string>
#include<algorithm>
#include<stdio.h>
using namespace std;
vector<vector<string>> seqsToWords(vector<string> seq){
vector<vector<string>> dic;
for (int i = 0; i < seq.size(); i++){
vector<string> words;
int previous = 0;
string temp;
for (int j = 0; j < seq[i].size(); j++){
if (seq[i][j] == ' '){
temp = seq[i].substr(previous, j - previous);
auto it = find(words.begin(), words.end(), temp);
if (it != words.end()){
words.push_back(temp);
}
previous = j + 1;
}
}
temp = seq[i].substr(previous, seq[i].size() - previous);
auto it = find(words.begin(), words.end(), temp);
if (it != words.end()){
words.push_back(temp);
}
dic.push_back(words);
}
return dic;
}
int findSameNumber(vector<vector<string>> dic, vector<string> queryWords){
int maxNumber=0;
int index = 0;
for (int i = 0; i < dic.size(); i++){
int number = 0;
for (int j = 0; j < queryWords.size(); j++){
auto it = find(dic[i].begin(), dic[i].end(), queryWords[j]);
if (it != dic[i].end()){
number++;
}
}
if (number > maxNumber) {
maxNumber = number;
index = i;
}
}
return index;
}
vector<string> solve(vector<string> seq, vector<string> query){
vector<string> result;
vector<vector<string>> dic;
vector<vector<string>> queryWords;
dic = seqsToWords(seq);
queryWords = seqsToWords(query);
for (int i = 0; i < queryWords.size(); i++){
int index = findSameNumber(dic, queryWords[i]);
result.push_back(seq[i]);
}
return result;
}
int main() {
int n;
vector<string> seqs;
cin >> n;
int m;
vector<string> query;
cin >> m;
string temp;
getline(cin, temp);//读取第一行的换行符
for (int i = 0; i < n; i++){
getline(cin,temp);
seqs.push_back(temp);
}
for (int i = 0; i < m; i++){
getline(cin, temp);
query.push_back(temp);
}
vector<string> result = solve(seqs,query);
for (int i = 0; i < m; i++){
cout << result[i] << endl;
}
return 0;
}