【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;
}
}
評測結果
點選圖片,滑鼠不釋放,拖動一段位置,釋放後在新的視窗中檢視完整圖片。