1. 程式人生 > 實用技巧 >同構字串

同構字串

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

如果s中的字元可以被替換得到t,那麼這兩個字串是同構的。

所有出現的字元都必須用另一個字元替換,同時保留字元的順序。兩個字元不能對映到同一個字元上,但字元可以對映自己本身。

示例 1:

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

示例 2:

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

示例 3:

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

說明:
你可以假設s和 t 具有相同的長度。

解法:

我們可以利用一個 map 來處理對映。對於 s 到 t 的對映,我們同時遍歷 s 和 t ,假設當前遇到的字母分別是 c1 和 c2 。

如果 map[c1] 不存在,那麼就將 c1 對映到 c2 ,即 map[c1] 
= c2。 如果 map[c1] 存在,那麼就判斷 map[c1] 是否等於 c2,也就是驗證之前的對映和當前的字母是否相同。 對於這道題,我們只需要驗證 s - > t 和 t -> s 兩個方向即可。如果驗證一個方向,是不可以的。 舉個例子,s = ab, t = cc,如果單看 s -> t ,那麼 a -> c, b -> c 是沒有問題的。 必須再驗證 t -> s,此時,c -> a, c -> b,一個字母對應了多個字母,所以不是同構的。 程式碼的話,只需要呼叫兩次上邊的程式碼即可。
 1 public boolean
isIsomorphic(String s, String t) { 2 return isIsomorphicTest(s,t) && isIsomorphicTest(t,s); 3 } 4 5 public boolean isIsomorphicTest(String s, String t) { 6 Map<Character,Character> map = new HashMap<>(); 7 for(int i = 0;i < s.length();i ++){
8 char a = s.charAt(i); 9 char b = t.charAt(i); 10 if(map.containsKey(a)){ 11 if(map.get(a)!=b){ 12 return false; 13 } 14 }else{ 15 map.put(a,b); 16 } 17 } 18 return true; 19 }