一、題目名稱java
Isomorphic Strings(同構的字符串)數組
二、題目地址code
https://leetcode.com/problems/isomorphic-strings/leetcode
三、題目內容開發
英文:字符串
Given two strings s and t, determine if they are isomorphic.get
Two strings are isomorphic if the characters in s can be replaced to get t.string
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.hash
中文:it
給出兩個字符串s和t,肯定它們是否同構。兩個字符串是同構的充要條件是它們之間相同位置的字符存在一一對應關係能夠相互替換。在字符串s中不存在兩個不一樣的字符映射到t中同一個字符的狀況,但一個字符能夠映射到它自身。
例如:egg和add是同構的,foo和bar不是同構的,paper和title是同構的
四、解題方法1
若是使用Java語言,使用HashMap來記住這些字符對是一個很方便的作法。在這裏面我用了兩個HashMap,一個HashMap用來記s的字符到t的映射,用於判斷s中的兩個字符不能用t中的同一個字符替換,另外一個HashMap用來記t的字符到s的映射,用於判斷t中的兩個字符不能由s中同一個字符映射而來。實現的Java代碼以下:
import java.util.HashMap; /** * 功能說明:LeetCode 205 - Isomorphic Strings * 開發人員:Tsybius2014 * 開發時間:2015年8月8日 */ public class Solution { /** * 判斷字符串是否同構 * @param s 字符串s * @param t 字符串t * @return */ public boolean isIsomorphic(String s, String t) { if (s.length() != t.length()) { return false; } HashMap<Character, Character> hashMapS = new HashMap<Character, Character>(); HashMap<Character, Character> hashMapT = new HashMap<Character, Character>(); for (int i = 0; i < s.length(); i++) { if (hashMapS.containsKey(s.charAt(i))) { if (hashMapS.get(s.charAt(i)) != t.charAt(i)) { return false; } } else { if (hashMapT.containsKey(t.charAt(i))) { return false; } hashMapS.put(s.charAt(i), t.charAt(i)); hashMapT.put(t.charAt(i), s.charAt(i)); } } return true; } }
五、解題方法2
另外一個不使用HashMap的方法是使用兩個數組,其思路和HashMap相似,實現的Java代碼以下:
/** * 功能說明:LeetCode 205 - Isomorphic Strings * 開發人員:Tsybius2014 * 開發時間:2015年8月8日 */ public class Solution { /** * 判斷字符串是否同構 * @param s 字符串s * @param t 字符串t * @return */ public boolean isIsomorphic(String s, String t) { if (s.length() != t.length()) { return false; } //雖然不考慮英文大小寫,但由於不單單有26個英文字母,還可能有其餘符號,因此數組要開得足夠大 int len = 40; //這裏數組長度開到40,能夠知足題目AC char[] charInS = new char[len]; char[] charInT = new char[len]; for (int i = 0; i < len; i++) { charInS[i] = '0'; charInT[i] = '0'; } boolean bTrue; for (int i = 0; i < s.length(); i++) { bTrue = false; //在數組s中找到當前字符串s的字母,若是數組t中相同位置字母不一致,則字符串不一樣構 for (int j = 0; j < len; j++) { if (charInS[j] == '0') { break; } else if (charInS[j] == s.charAt(i)) { if (charInT[j] != t.charAt(i)) { return false; } bTrue = true; } } if (!bTrue) { //在數組t中找到當前字符串t的字母,若是數組s中相同位置字母不一致,則字符串不一樣構 for (int j = 0; j < len; j++) { if (charInT[j] == '0') { break; } else if (charInT[j] == t.charAt(i)) { return false; } } //記錄新的組合 for (int k = 0; k < len; k++) { if (charInS[k] == '0') { charInS[k] = s.charAt(k); charInT[k] = t.charAt(k); break; } } } } return true; } }
END