每日一練(43):同構字串

加班猿發表於2022-04-21

title: 每日一練(43):同構字串

categories:[劍指offer]

tags:[每日一練]

date: 2022/04/15


每日一練(43):同構字串

給定兩個字串 s 和 t ,判斷它們是否是同構的。

如果 s 中的字元可以按某種對映關係替換得到 t ,那麼這兩個字串是同構的。

每個出現的字元都應當對映到另一個字元,同時不改變字元的順序。不同字元不能對映到同一個字元上,相同字元只能對映到同一個字元上,字元可以對映到自己本身。

示例 1:

輸入:s = "egg", t = "add"

輸出:true

示例 2:

輸入:s = "foo", t = "bar"

輸出:false

示例 3:

輸入:s = "paper", t = "title"

輸出:true

提示:

1 <= s.length <= 5 * 104

t.length == s.length

s 和 t 由任意有效的 ASCII 字元組成

來源:力扣(LeetCode)

連結:https://leetcode-cn.com/probl...

方法一

思路分析

t.length == s.length 所以無需考慮長度

相同的字元用find找到的index一定是一樣的

利用這點我們可以利用find來驗證是否pattern相同

  1. 假設有foo和baa,當我們到最後一個index時s裡找'o'和t裡找'a'一定會返回
  2. 相同的index,因為之前已經出現過了,這裡s裡的'o'跟t裡的'a'都會返回index 1
  3. 再假設我們有foo和bar,'fo'和'ba'是沒有問題的,但是當我們到最後一個index時
  4. s裡的'o'會返回1,因為之前已經出現過,而t裡的'r'會返回2,因為之前並沒有
  5. 出現過這個字母,這樣就可以驗證他們的pattern是否相同
bool isIsomorphic(string s, string t) {
    for (int i = 0; i < s.size(); ++i) {
        if (s.find(s[i]) != t.find(t[i])) {
            return false
        }
    }
    return true;
}

方法二

思路分析

為具有對應關係的字元連邊並賦予權值,初始值為 0 表示未有對映關係,同為 0 才能連邊

因此如果是同構字串,每對字元的值應該相等

bool isIsomorphic(string s, string t) {
    int sm[128] = {0};
    int tm[128] = {0};
    for (int i = 0; i < s.size(); i++) {
        if (sm[s[i]] != tm[t[i]]) {
            return false;
        }
        sm[s[i]] = tm[t[i]] = i + 1;
    }
    return true;
}

相關文章