Cho nhiều câu dưới dạng chuỗi. Mục tiêu là đếm số từ tồn tại trong tất cả các câu.
Lưu ý - chỉ xét các từ chứa toàn bộ chữ cái thường.
Nếu các câu là:
"I am learning C language"
"learning new things is easy"
"Kids are learning healthy habits"
Chỉ "learning" xuất hiện trong cả ba. Số lượng = 1.
Ví dụ
Đầu vào - "The clothes were dry", "All the kids were playing", "Those were the best days"
Đầu ra - Số từ xuất hiện trong tất cả câu là 2
Giải thích - Từ "the" và "were" xuất hiện trong tất cả.
Đầu vào - "We are going to school", "If you are willing then continue", "All these are sold"
Đầu ra - Số từ xuất hiện trong tất cả câu là 1
Giải thích - Từ "are" xuất hiện trong tất cả.
Phương pháp sử dụng
Ta lưu các từ của câu đầu tiên vào vector<pair<string, bool>> set. Tìm các từ trong set này ở tất cả câu khác dùng unordered_map<string, bool> check.
- Nhập vector
vec chứa các câu - Số câu = vec.size()
- Hàm
words_sentences(vector<string> vec, int size)trả về số từ chung - Khởi tạo count = 0, chuỗi tạm str
- Duyệt câu đầu vec[0] tách từ (kết thúc bằng khoảng trắng), thêm pair(str, true) vào set
- Duyệt các câu từ câu 2 đến cuối: tách từ, đánh dấu trong map check
- Duyệt set: nếu từ không có trong check của câu hiện tại -> set[k].second = false
- Cuối cùng đếm số set[k].second == true
- Trả về count
Chương trình minh họa
#include <bits/stdc++.h>
using namespace std;
int words_sentences(vector<string> vec, int size) {
int count = 0;
int i = 0;
string str;
unordered_map<string, bool> check;
vector<pair<string, bool>> set;
pair<string, bool> str_bool;
// Xử lý câu đầu tiên
while (i < vec[0].size()) {
str = "";
while (i < vec[0].size() && vec[0][i] != ' ') {
str += vec[0][i];
i++;
}
i++;
if (str != "") {
str_bool = make_pair(str, true);
set.push_back(str_bool);
}
}
// Xử lý các câu còn lại
for (int j = 1; j < size; j++) {
check.clear();
i = 0;
while (i < vec[j].size()) {
str = "";
while (i < vec[j].size() && vec[j][i] != ' ') {
str += vec[j][i];
i++;
}
i++;
if (str != "")
check[str] = true;
}
for (int k = 0; k < set.size(); k++) {
if (set[k].second != false && check[set[k].first] == false)
set[k].second = false;
else if (set[k].second != false && check[set[k].first] == true)
check[set[k].first] = false;
}
}
for (int k = 0; k < set.size(); k++)
if (set[k].second == true)
count++;
return count;
}
int main() {
vector<string> vec;
vec.push_back("Honesty is the best policy");
vec.push_back("policy varies from company to company");
vec.push_back("Employee should follow the policy of a company");
int size = vec.size();
cout << "Số từ xuất hiện trong tất cả các câu là: " << words_sentences(vec, size);
return 0;
}
Đầu ra
Số từ xuất hiện trong tất cả các câu là: 1