LeetCode205 同構字串
阿新 • • 發佈:2018-12-16
題目
給定兩個字串 s 和 t,判斷它們是否是同構的。 如果 s 中的字元可以被替換得到 t ,那麼這兩個字串是同構的。 所有出現的字元都必須用另一個字元替換,同時保留字元的順序。兩個字元不能對映到同一個字元上,但字元可以對映自己本身
示例
- 示例 1: 輸入: s = “egg”, t = “add” 輸出: true
- 示例 2: 輸入: s = “foo”, t = “bar” 輸出: false
- 示例 3: 輸入: s = “paper”, t = “title” 輸出: true
C++程式碼
字母一一對應,可以採用它們的位置作為中間聯絡。 對於foo和bar 如f、b出現在第0位,o和a出現在第1位,而o和r,一個已經出現在了第1位,一個還未出現,則返回false。
class Solution { public: bool isIsomorphic(string s, string t) { if(s.length()!=t.length()) return false; map<char,char> ms,mt; for(int i=0;i<s.length();i++) { if(ms.find(s[i])==ms.end()&&mt.find(t[i])==mt.end()) //s和t的第i個字元都是第一次出現,將它們出現的位置儲存下來 { ms[s[i]]=i; mt[t[i]]=i; } else if(ms.find(s[i])!=ms.end()&&mt.find(t[i])!=mt.end()) //都不是第一次出現,則比較它們之前出現的位置是否相同 { if(ms[s[i]]!=mt[t[i]]) return false; } else return false; } return true; } };
採用了兩個map,字元為鍵,索引為值。先儲存兩個字串中字元對應的位置,邊存邊比較,對於兩個字串第i位上的字元,若出現過了,則比較兩個字元出現的位置是否相同,很明顯如果不相同則兩個字串不同構,相同的話繼續;當然,如果兩個字串中,其中一個的第i個字元已經出現過了,而另一個字串的第i個字元沒有,很明顯也不同構。能夠完成迴圈的,必然是同構的。