判斷字串 str(單詞以空格分隔)是否符合模式 pattern(字母)。需建立字母與單詞的**雙向一一對應**。
將 pattern 和 str 分別轉為「首次出現索引序列」,比較兩序列是否相同。
abba → 0,1,1,0dog cat cat dog → 0,1,1,0vectorsplit(const string& s) { istringstream iss(s); string word; vector res; while (iss >> word) res.push_back(word); // 自動按空白分割 return res; }
class Solution {
vector encodePattern(const string& pat) {
unordered_map mp;
vector seq;
int idx = 0;
for (char c : pat) {
if (!mp.count(c)) mp[c] = idx++;
seq.push_back(mp[c]);
}
return seq;
}
vector encodeWords(const string& str) {
istringstream iss(str);
string word;
unordered_map mp;
vector seq;
int idx = 0;
while (iss >> word) {
if (!mp.count(word)) mp[word] = idx++;
seq.push_back(mp[word]);
}
return seq;
}
public:
bool wordPattern(string pattern, string str) {
vector p = encodePattern(pattern);
vector s = encodeWords(str);
return p == s; // 長度不同自動 false
}
};
O(n),n 為字串總長度。O(m),m 為不同字母/單詞數。istringstream 自動處理多空格、前後空格等邊界情況。==,可讀性極高。