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相同
- 假設有foo和baa,當我們到最後一個index時s裡找'o'和t裡找'a'一定會返回
- 相同的index,因為之前已經出現過了,這裡s裡的'o'跟t裡的'a'都會返回index 1
- 再假設我們有foo和bar,'fo'和'ba'是沒有問題的,但是當我們到最後一個index時
- s裡的'o'會返回1,因為之前已經出現過,而t裡的'r'會返回2,因為之前並沒有
- 出現過這個字母,這樣就可以驗證他們的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;
}