1. 程式人生 > 實用技巧 >Linux看門狗指令碼 1.4

Linux看門狗指令碼 1.4

今天在力扣上看到一道題,判斷兩個字串是否為同構字串,題目如下:

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

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

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

示例 1:

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

示例 2:

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

示例 3:

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

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

來源:力扣(LeetCode)


連結:https://leetcode-cn.com/problems/isomorphic-strings
著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。

開始一直理解為字元可以對映自己本身和兩個字元不能對映同一字元不衝突,也就是我一直覺得假設a對映a,如果後續出現b對映a,那麼也是成立的。

然而,連錯兩次之後,調整了一下程式碼,如果前面有a映射了自己,後續再出現其他字元對映a則判斷為非同構字串,試了一下,通過了... ...

這可能就是語文沒學好吧... ...

思路比較簡單就是有點費記憶體:

儲存對映,然後校驗得出結果。

class Solution {
    public
boolean isIsomorphic(String s, String t) { Map<Character, Character> map = new HashMap<>(); char[] sarr = s.toCharArray(); char[] tarr = t.toCharArray(); boolean res = true; for (int i = 0; i < sarr.length; i++) { if (map.containsKey(sarr[i])) {
if (map.get(sarr[i]) == tarr[i]) { continue; } res = false; break; } else if (map.containsValue(tarr[i])) { res = false; break; } else { map.put(sarr[i], tarr[i]); } } return res; } }

還有另一種思路但是沒實踐過:

假設字串s為標準去校驗字串t,先將兩個字串轉為陣列,遍歷字元陣列s,獲取到與當前元素同位的字元陣列t中的元素,然後從頭開始遍歷字元陣列t,如果沒有發現該元素,那麼進行字元陣列s的第二次遍歷。

反之,如果發現與該元素相同的元素,則獲取相同元素的下標,找到字元陣列s中該下標上的元素,與當前遍歷到的字元陣列s中的元素相對比,兩者相同則continue,否則說明兩個字串不是同構字串。

這種思路應該是可以成立的,雖然我沒試過。好處就是不需要儲存映射了,壞處就是可能運算的時間會更長(感覺這樣遍歷的話,應該比使用Map中的contains方法來的慢,僅為猜測沒測試過)。