1. 程式人生 > >【LeetCode-面試演算法經典-Java實現】【205-Isomorphic Strings(同構字串)】

【LeetCode-面試演算法經典-Java實現】【205-Isomorphic Strings(同構字串)】

原題

  Given two strings s and t, determine if they are isomorphic.
  Two strings are isomorphic if the characters in s can be replaced to get t.
  All occurrences of a character must be replaced with another character while preserving the order of characters. No two characters may map to the same character but a character may map to itself.
  For example,
  Given "egg"

, "add", return true.
  Given "foo", "bar", return false.
  Given "paper", "title", return true.

題目大意

  給定兩個字串s和t,判斷它們是否是同構的。如果字串s可以通過字元替換的方式得到字串t,則稱s和t是同構的。字元的每一次出現都必須被其對應字元所替換,同時還需要保證原始順序不發生改變。兩個字元不能對映到同一個字元,但是字元可以對映到其本身。

解題思路

  【只要s和t滿足一一對映就可以了】
  使用一個雜湊表map維護兩個字串中字元的對映關係,同時用一個set儲存對映的值。(s[i], t[i]),如是s[i]鍵沒有在map中出現過並且t[i]沒有在set中出現過,就加入到對映關係中,t[i]值已經出現過,說明是多對一對映,不符合返回false。s[i]鍵如果已經出現過,設為s[k],對應的對映值為t[k]),即s[i]==s[k],則找出s[k]的對對應值t[k],如果t[i]!=t[k],說明一個同一個字元存在兩個不同的對映,兩個字串不是同構的,返回false,繼續處理下一個字元,直到結束。

程式碼實現

演算法實現類

import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;

public class Solution {

    public boolean isIsomorphic(String s, String t) {

        // 兩個字串都為空
        if (s == null && t == null) {
            return true;
        }
        // 只有一個為空
else if (s == null || t == null) { return false; } // 兩個字串的長度都為0 else if (s.length() == 0 && t.length() == 0) { return true; } // 兩個字串的長度不相等 else if (s.length() != t.length()) { return false; } // 儲存對映關係 Map<Character, Character> map = new HashMap<>(s.length()); Set<Character> set = new HashSet<>(t.length()); char sChar; char tChar; for (int i = 0; i < s.length(); i++) { sChar = s.charAt(i); tChar = t.charAt(i); // 鍵未出現過,就儲存對映關係 if (!map.containsKey(sChar)) { if (set.contains(tChar)) { return false; } else { map.put(s.charAt(i), t.charAt(i)); set.add(tChar); } } // 如是鍵已經出現過 else { // 原先的鍵對映的值是map.get(sChar),現在要對映的值是tChar // 如果兩個值不相等,說明已經映射了兩次,不符合,返回false if (map.get(sChar) != tChar) { return false; } } } return true; } }

評測結果

  點選圖片,滑鼠不釋放,拖動一段位置,釋放後在新的視窗中檢視完整圖片。

這裡寫圖片描述

特別說明