給定兩個字符串 s 和 t,判斷它們是否同構。同構定義為:s 中的字符可以被替換得到 t,所有相同字符必須映射到同一字符,且不同字符不能映射到同一字符(但字符可映射到自身)。假設兩字符串長度相等。
示例:
s = "egg", t = "add" → trues = "foo", t = "bar" → falses = "paper", t = "title" → true為確保一對一映射關係,需同時維護兩個映射表:
s → t 映射:記錄 s 中每字符對應的 t 字符。t → s 映射:記錄 t 中每字符對應的 s 字符,防止兩個不同字符映射到同一字符。遍歷字符串,若發現映射衝突則返回 false;遍歷結束無衝突則返回 true。
class Solution {
public:
bool isIsomorphic(string s, string t) {
int map_s[256] = {0}; // s -> t 映射,0 表示未映射
int map_t[256] = {0}; // t -> s 映射
string transformed = "";
for (int i = 0; i < s.size(); ++i) {
char cs = s[i], ct = t[i];
// 建立 s -> t 映射
if (map_s[cs] == 0) map_s[cs] = ct;
// 建立 t -> s 映射
if (map_t[ct] == 0) map_t[ct] = cs;
else if (map_t[ct] != cs) return false; // 衝突:t 中字符已映射到不同的 s 字符
transformed.push_back(map_s[cs]);
}
return transformed == t;
}
};
map_t[ct] != cs 捕獲「一對多」情況。transformed 字符串驗證最終映射結果是否等於 t,邏輯清晰直觀。