首頁 > 軟體

Go Java演演算法之同構字串範例詳解

2022-08-16 14:02:20

同構字串

給定兩個字串 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 字元組成

方法一:雜湊表(Java)

此題需要我們判斷 s 和 t 每個位置上的字元是否都一一對應,即 s 的任意一個字元被 t 中唯一的字元對應,同時 t 的任意一個字元被 s 中唯一的字元對應。這也被稱為「雙射」的關係。

以範例 2 為例,t 中的字元 a 和 r 雖然有唯一的對映 o,但對於 s 中的字元 o 來說其存在兩個對映 {a,r},故不滿足條件。

因此,我們維護兩張雜湊表,第一張雜湊表 s2t 以 s 中字元為鍵,對映至 t 的字元為值,第二張雜湊表 t2s 以 t 中字元為鍵,對映至 s 的字元為值。

class Solution {
    public boolean isIsomorphic(String s, String t) {
        Map<Character, Character> s2t = new HashMap<Character, Character>();
        Map<Character, Character> t2s = new HashMap<Character, Character>();
        int len = s.length();
        for (int i = 0; i < len; ++i) {
            char x = s.charAt(i), y = t.charAt(i);
            if ((s2t.containsKey(x) && s2t.get(x) != y) || (t2s.containsKey(y) && t2s.get(y) != x)) {
                return false;
            }
            s2t.put(x, y);
            t2s.put(y, x);
        }
        return true;
    }
}

時間複雜度:O(N)

空間複雜度:O(1)

方法一:雜湊表(Go)

具體的方法思路已經在上文中表述,具體詳情請看上文內容。

方法思路:

  • 定義兩個map容器用於儲存兩個字串的對映關係map_s、map_t
    • map_s:以 s 中字元為鍵,對映至 t 的字元為值
    • map_t: 以 t 中字元為鍵,對映至 s 的字元為值
  • 遍歷字串(兩個字串長度相等同時遍歷)
  • 不斷更新兩張雜湊表,如果出現衝突時說明兩個字串無法構成同構,返回 false。
  • 衝突定義:即當前下標 index 對應的字元 map_s[index] 已經存在對映且不為 t[index] 或當前下標 index 對應的字元map_t[index] 已經存在對映且不為 s[index]也就是程式碼中的if判斷條件
func isIsomorphic(s, t string) bool {
    s2t := map[byte]byte{}
    t2s := map[byte]byte{}
    for i := range s {
        x, y := s[i], t[i]
        if s2t[x] > 0 && s2t[x] != y || t2s[y] > 0 && t2s[y] != x {
            return false
        }
        s2t[x] = y
        t2s[y] = x
    }
    return true
}

時間複雜度:O(N)

空間複雜度:O(1)

以上就是Go Java演演算法之同構字串範例詳解的詳細內容,更多關於Go Java演演算法同構字串的資料請關注it145.com其它相關文章!


IT145.com E-mail:sddin#qq.com