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

代码如下:

 

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 @ 2018-08-03 12:56  Booker808  阅读(486)  评论(0编辑  收藏  举报