Leetcode 205. 同構字符串


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

如果 中的字符可以被替換得到 ,那么這兩個字符串是同構的。

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

示例 1:

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

示例 2:

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

示例 3:

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

說明:
你可以假設 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 }
View Code

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM