給定模式串 pattern(僅小寫字母)和字符串 str(單詞以單空格分隔),判斷 str 是否遵循 pattern 的雙射關係:每個字母唯一對應一個非空單詞,且不同字母對應不同單詞。
示例:
abba, "dog cat cat dog" → trueabba, "dog cat cat fish" → falseaaaa, "dog cat cat dog" → falseabba, "dog dog dog dog" → false維護兩個結構:
char → string 映射(unordered_map)string → bool 已用單詞集合(unordered_set)遍歷模式字符與單詞:
falsefalse長度不匹配直接 false。
// C++ Runtime: 0 ms
class Solution {
public:
bool wordPattern(string pattern, string str) {
vector<string> words;
istringstream iss(str);
string w;
while (iss >> w) words.push_back(w);
if (words.size() != pattern.size()) return false;
unordered_map<char, string> map;
unordered_set<string> used;
for (int i = 0; i < pattern.size(); i++) {
char c = pattern[i];
if (!map.count(c)) {
if (used.count(words[i])) return false;
map[c] = words[i];
used.insert(words[i]);
} else if (map[c] != words[i]) {
return false;
}
}
return true;
}
};
// Java Runtime: 3 ms
public class Solution {
public boolean wordPattern(String pattern, String str) {
String[] words = str.split(" ");
if (pattern.length() != words.length) return false;
Map<Character, String> map = new HashMap<>();
for (int i = 0; i < pattern.length(); i++) {
char c = pattern.charAt(i);
if (!map.containsKey(c)) {
if (map.containsValue(words[i])) return false;
map.put(c, words[i]);
} else if (!map.get(c).equals(words[i])) {
return false;
}
}
return true;
}
}
n = pattern.length(),Hash 操作 O(1) 平均)k 為不同字符數(≤26)istringstream 分割字符串,Java 用 split(" ")map 保證字符→單詞唯一,used 保證單詞→字符唯一map.containsValue 是 O(n),但 k≤26 可忽略;大規模時應維護反向 Map<String, Character>