Leetcode205. 同构字符串

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
  }
发布了112 篇原创文章 · 获赞 1 · 访问量 5974

猜你喜欢

转载自blog.csdn.net/sunhaiting666/article/details/103858967
今日推荐