1. 程式人生 > >LeetCode205 同構字串

LeetCode205 同構字串

題目

給定兩個字串 s 和 t,判斷它們是否是同構的。 如果 s 中的字元可以被替換得到 t ,那麼這兩個字串是同構的。 所有出現的字元都必須用另一個字元替換,同時保留字元的順序。兩個字元不能對映到同一個字元上,但字元可以對映自己本身

示例

  1. 示例 1: 輸入: s = “egg”, t = “add” 輸出: true
  2. 示例 2: 輸入: s = “foo”, t = “bar” 輸出: false
  3. 示例 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個字元沒有,很明顯也不同構。能夠完成迴圈的,必然是同構的。