Giả sử chúng ta có một mẫu và một chuỗi str, hãy tìm xem str có theo cùng một mẫu hay không. Ở đây theo sau có nghĩa là có sự phân biệt giữa một chữ cái trong mẫu và một từ không trống trong str.
Vì vậy, nếu đầu vào giống như pattern ="cbbc", str ="word pattern pattern word", thì đầu ra sẽ là True.
Để giải quyết vấn đề này, chúng tôi sẽ làm theo các bước sau -
-
strcin:=str
-
Xác định một mảng các từ
-
cho mỗi từ trong strcin
-
chèn từ vào cuối từ
-
-
Xác định một bản đồ p2i
-
i:=0
-
pat:=chuỗi trống
-
for c in pattern -
-
nếu c không phải là thành viên của p2i, thì -
-
(tăng tôi lên 1)
-
p2i [c]:=i
-
-
pat:=pat nối p2i [c]
-
-
Xác định một str2i bản đồ
-
i:=0
-
pat1:=chuỗi trống
-
cho c trong từ -
-
nếu c không phải là thành viên của str2i, thì -
-
(tăng tôi lên 1)
-
str2i [c]:=i
-
-
pat1:=pat1 nối str2i [c]
-
-
trả về true khi pat1 giống pat
Ví dụ
Hãy cùng chúng tôi xem cách triển khai sau để hiểu rõ hơn -
#include <bits/stdc++.h> using namespace std; class Solution { public: bool wordPattern( string pattern, string str ) { istringstream strcin(str); string word; vector<string> words; while (strcin >> word) words.push_back(word); unordered_map<char, int> p2i; int i = 0; string pat = ""; for (auto c : pattern) { if (p2i.count(c) == 0) { i++; p2i[c] = i; } pat += to_string(p2i[c]); } unordered_map<string, int> str2i; i = 0; string pat1 = ""; for (auto c : words) { if (str2i.count(c) == 0) { i++; str2i[c] = i; } pat1 += to_string(str2i[c]); } return pat1 == pat; } }; main(){ Solution ob; cout << (ob.wordPattern("cbbc", "word pattern pattern word")); }
Đầu vào
"cbbc", "word pattern pattern word"
Đầu ra
1