LeetCode205----同构字符串

给定两个字符串 和 t,判断它们是否是同构的。

如果 中的字符可以被替换得到 ,那么这两个字符串是同构的。

所有出现的字符都必须用另一个字符替换,同时保留字符的顺序。两个字符不能映射到同一个字符上,但字符可以映射自己本身。

示例 1:

输入: s = "egg", t = "add"
输出: true

示例 2:

输入: s = "foo", t = "bar"
输出: false

示例 3:

输入: s = "paper", t = "title"
输出: true

说明:
你可以假设 和 具有相同的长度。

 

思路:

我们拿"paperp"和"titlel"举例:

(1)首先我们会定义一个哈希表(Map)来完成一种一一对应的关系,第一次进来时我们把p和t对应

         p <==> t

(2)这时我们继续判断下一个字符a和i,我们在哈希表中并没有找到以a为key的项,并且t作为value也并没有出现在其他项中,所以我们添加a t键值对

         p <==> t  a <==> i

(3)继续,我们又找到了p字符和t字符,我们可以在哈希表中找到以p为key的项,并且value是t,而我们此时遍历到的确实是t,代表匹配上了,继续下一个

(4)拿到e和l字符,哈希表没有以e为key的项,并且l也没有作为value出现在其他项内,所以添加键值对

         p <==> t  a <==> i e <==> l

(5)继续拿到r和e字符串,哈希表内没有找到以r为key的项,并且e没有作为value出现在其他项内,所以添加键值对

         p <==> t  a <==> i e <==> l  r <==> e

(6)继续拿到p和l,这时要注意,我们可以在哈希表内找到以p为key的项,并且该项的value不是l !!所以这时没有匹配上,整段垮掉,返回false

代码如下:

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public class LeetCode205 {
 
    public static boolean isIsomorphic(String s, String t) {
        if (s.length() != t.length()) {
            return false;
        }
        char[] ss = s.toCharArray();
        char[] tt = t.toCharArray();
        Map<Character, Character> map = new HashMap<>();
        for (int sIndex = 0, tIndex = 0; tIndex < tt.length; tIndex++, sIndex++) {
            if (!map.containsKey(ss[sIndex])) {
                if (!map.containsValue(tt[tIndex])) {
                    map.put(ss[sIndex], tt[tIndex]);
                } else {
                    return false;
                }
            }
            if (!map.get(ss[sIndex]).equals(tt[tIndex])) {
                return false;
            }
            continue;
        }
        return true;
    }
}
posted @ 2019-07-06 17:51  天涯海角路  阅读(123)  评论(0)    收藏  举报