同位字符串。给两个字符串s和t,判断他们是否互为同位字符串。同位字符串的定义是比如在s中有个字母“e”,在t中对应位置上有一个字母“g”,那么s中剩下所有的e应该在t对应位置上对应的是字母g。例子如下
Example 1:
Input: s ="egg",
t ="add"
Output: trueExample 2:
Input: s ="foo",
t ="bar"
Output: falseExample 3:
Input: s ="paper",
t ="title"
Output: true
两种思路。一个是用hashmap做,一个是用counting sort的思路做。
遍历两个字符串,用hashmap存同样位置上s和t字母的对应关系。如果发觉有对不上的,就return false;遍历完的话就return true。
时间O(n)
空间O(n)
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 };
counting sort的思路跟hashmap很像,也是遍历字符串。用以上的example 1举例好了。当s遇到第一个字母e的时候,记录letters["e"] = "a",这样就记下了字母e和字母a的对应关系。如果发现有对不上的,就return false,直到遍历结束。
时间O(n)
空间O(1)
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 };