[LeetCode] 205. Isomorphic Strings

同位字符串。给两个字符串s和t,判断他们是否互为同位字符串。同位字符串的定义是比如在s中有个字母“e”,在t中对应位置上有一个字母“g”,那么s中剩下所有的e应该在t对应位置上对应的是字母g。例子如下

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

两种思路。一个是用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 };

猜你喜欢

转载自www.cnblogs.com/aaronliu1991/p/11762616.html