Leetcode205. 同构字符串
题目:
给定两个字符串 s 和 t,判断它们是否是同构的。
如果 s 中的字符可以被替换得到 t ,那么这两个字符串是同构的。
所有出现的字符都必须用另一个字符替换,同时保留字符的顺序。两个字符不能映射到同一个字符上,但字符可以映射自己本身。
示例 1:
输入: s = “egg”, t = “add”
输出: true
题解:
方案一:使用字符串第一次出现的位置(indexOf)来判断
方案二:使用hashMap方式将两个字符串的字符存入key,value。
注意:
我们需要验证 s - > t 和 t -> s 两个方向。如果验证一个方向,是不可以的。
举个例子,s = ab, t = cc,如果单看 s -> t ,那么 a -> c, b -> c 是没有问题的。必须再验证 t -> s,此时,c -> a, c -> b,一个字母对应了多个字母,所以不是同构的。
scala代码如下:
/**
* 使用字符串第一次出现的位置来判断
*
* @param s
* @param t
* @return
*/
def isIsomorphic(s: String, t: String): Boolean = {
var flag = true
val ch1 = s.toCharArray
val ch2 = t.toCharArray
for (i <- 0 until ch1.length) {
//indexOf:返回第一次出现的指定子字符串在此字符串中的索引
if (s.indexOf(ch1(i)) != t.indexOf(ch2(i))) {
flag = false
}
}
flag
}
/**
* hashMap方法
*
* @param s
* @param t
* @return
*/
def isIsomorphic2(s: String, t: String): Boolean = {
isIsomorphicHelper(s,t) && isIsomorphic2(t,s)
}
def isIsomorphicHelper(s: String, t: String): Boolean = {
val map = new java.util.HashMap[Char, Char]()
var flag = true
var i = 0
while (i < s.length && flag) {
val s1: Char = s.charAt(i)
val t1: Char = t.charAt(i)
if (map.containsKey(s1)) {
if (map.get(s1) != t1) {
flag = false
}
} else {
map.put(s1, t1)
}
i = i + 1
}
flag
}