給定兩個字符串 s 和 t,判斷它們是否是同構的。
如果 s 中的字符可以被替換得到 t ,那么這兩個字符串是同構的。
所有出現的字符都必須用另一個字符替換,同時保留字符的順序。兩個字符不能映射到同一個字符上,但字符可以映射自己本身。
示例 1:
輸入: s ="egg",
t ="add"
輸出: true
示例 2:
輸入: s ="foo",
t ="bar"
輸出: false
示例 3:
輸入: s ="paper",
t ="title"
輸出: true
說明:
你可以假設 s 和 t 具有相同的長度。
思路:如果你用的是JAVA的話上去就直接拍hashmap就可以解決這個問題
但是如果你不會用則可以用數組標記,用一個變量top標記當前出現的字母是第幾個
比如 樣例的"egg",e是第一個出現的,g是第二個出現的,然后你用一個數組標記這些字符是否出現過,如果出現過,則直接把把他們的順序賦值到ans1數組內,如果沒有則標記他們是第幾個出現的
這樣子egg在ans1內就是122,foo也是122這樣子就是同構的
foo則是122,bar則是123
就不是同構的

1 int mark[1000001]; 2 int ans1[101000],ans2[010010]; 3 bool isIsomorphic(char* s, char* t) 4 { 5 memset(mark,0,sizeof(mark)); 6 memset(ans1,0,sizeof(ans1)); 7 memset(ans2,0,sizeof(ans2)); 8 9 int len1=strlen(s),len2=strlen(t); 10 if(len1!=len2) 11 return false; 12 13 int top=1;///記錄出現了幾個的字符 14 for(int i=0;i<len1;i++) 15 { 16 if(mark[(int)s[i]]==0) 17 { 18 mark[(int)s[i]]=top;///標記字符 19 ans1[i]=mark[(int)s[i]];///賦值 20 top++; 21 } 22 else { 23 24 ans1[i]=mark[(int)s[i]]; 25 26 } 27 } 28 memset(mark,0,sizeof(mark)); 29 top=1; 30 for(int i=0;i<len2;i++) 31 { 32 if(mark[(int)t[i]]==0) 33 { 34 mark[(int)t[i]]=top; 35 ans2[i]=mark[(int)t[i]]; 36 top++; 37 } 38 else { 39 40 ans2[i]=mark[(int)t[i]]; 41 42 } 43 } 44 45 int flag=0; 46 for(int i=0;i<len1;i++) 47 if(ans1[i]!=ans2[i]) 48 return false; 49 50 return true; 51 }