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.
Example 1:
Input: s ="egg",
t ="add"
Output: true
Example 2:
Input: s ="foo",
t ="bar"
Output: false
Example 3:
Input: s ="paper",
t ="title"
Output: true
Note:
You may assume both s and t have the same length.
同构字符串。
给两个字符串 s 和 t,判断他们是否互为同位字符串。同位字符串的定义是比如在 s 中有个字母“e”,在 t 中对应位置上有一个字母“g”,那么 s 中剩下所有的 e 应该在t对应位置上对应的是字母 g。
两种思路。一个是用hashmap做,一个是用counting sort的思路做。
遍历两个字符串,用hashmap存同样位置上s和t字母的对应关系。如果发觉有对不上的,就return false;遍历完的话就return true。
时间O(n)
空间O(n)
JavaScript实现
1 /** 2 * @param {string} s 3 * @param {string} t 4 * @return {boolean} 5 */ 6 var isIsomorphic = function(s, t) { 7 if (s.length !== t.length) { 8 return false; 9 } 10 if (s === t) { 11 return true; 12 } 13 const obj1 = {}; 14 const obj2 = {}; 15 for (let i = 0; i < s.length; i++) { 16 const letter = s[i]; 17 const tLetter = t[i]; 18 if (!obj2[tLetter]) { 19 obj2[tLetter] = letter; 20 } 21 if (!obj1[letter]) { 22 obj1[letter] = tLetter; 23 } 24 if (obj1[letter] !== tLetter || obj2[tLetter] !== letter) { 25 return false; 26 } 27 } 28 return true; 29 };
Java实现
1 class Solution { 2 public boolean isIsomorphic(String s, String t) { 3 // corner case 4 if (s == null || t == null) { 5 return true; 6 } 7 8 // normal case 9 HashMap<Character, Character> map = new HashMap<>(); 10 for (int i = 0; i < s.length(); i++) { 11 char a = s.charAt(i); 12 char b = t.charAt(i); 13 if (map.containsKey(a)) { 14 if (map.get(a).equals(b)) { 15 continue; 16 } else { 17 return false; 18 } 19 } else { 20 if (!map.containsValue(b)) { 21 map.put(a, b); 22 } else { 23 return false; 24 } 25 } 26 } 27 return true; 28 } 29 }
counting sort的思路跟hashmap很像,也是遍历字符串。用以上的example 1举例好了。当s遇到第一个字母e的时候,记录letters["e"] = "a",这样就记下了字母e和字母a的对应关系。如果发现有对不上的,就return false,直到遍历结束。
时间O(n)
空间O(1)
JavaScript实现
1 /** 2 * @param {string} s 3 * @param {string} t 4 * @return {boolean} 5 */ 6 var isIsomorphic = function(s, t) { 7 if (s === t) { 8 return true; 9 } 10 var len = s.length; 11 var i = 1; 12 if (len !== t.length) { 13 return false; 14 } 15 while (i < len) { 16 if (s.indexOf(s[i]) === t.indexOf(t[i])) { 17 i++; 18 } else { 19 break; 20 } 21 } 22 return i === len; 23 };
Java实现
1 class Solution { 2 public boolean isIsomorphic(String s, String t) { 3 int[] sChars = new int[256]; 4 int[] tChars = new int[256]; 5 for (int i = 0; i < s.length(); i++) { 6 if (sChars[s.charAt(i)] != tChars[t.charAt(i)]) { 7 return false; 8 } else { 9 sChars[s.charAt(i)] = tChars[t.charAt(i)] = t.charAt(i); 10 } 11 } 12 return true; 13 } 14 }
相关题目