Leetcode - Isomorphic Strings

Question

Given two strings s and t, determine if they are isomorphic.

Two strings are isomorphic if the characters in s can be replaced to get t.

All occurrences of a character must be replaced with another character while preserving the order of characters. No two characters may map to the same character but a character may map to itself.

Example

Given “egg”, “add”, return true.

Given “foo”, “bar”, return false.

Given “paper”, “title”, return true.

Note

You may assume both s and t have the same length.

Java Code

//版本一:使用HashMap存储字符之间的映射关系
   public boolean isIsomorphic(String s, String t) {
       int len = s.length();
       if(len < 2) return true;

       //把<s, t>作为键值对存入HashMap中
       HashMap<String, String> map = new HashMap<>(2*len);

       String sKey = null;
       String tValue = null;
       for (int i = 0; i < len; i++) {
        //得到当前的<sKey, tValue>映射关系
        sKey = "" + s.charAt(i);
        tValue = "" + t.charAt(i);

        if(map.containsKey(sKey)) {
            //如果map中已经存在当前字符sKey且其映射的字符与当前tValue不同,返回假
            if(!tValue.equals(map.get(sKey)))
                return false;
        }else {
            //如果map中不存在当前字符sKey但已经有其他的键映射到当前的tValue,返回假
            if(map.containsValue(tValue))
                return false;
            //如果map中不存在当前的键值对<sKey, tValue>,则存入
            map.put(sKey, tValue);
        }
    }

       return true;
   }

   //版本二:使用数组记录原字符和映射字符的状态并存储字符之间的映射关系
   public boolean isIsomorphic2(String s, String t) {
       boolean [] key = new boolean[128];//默认初始化为false,用于标记各个key是否存在
       boolean[] value = new boolean[128];//默认初始化为false,用于标记各个value是否存在
       int[] map = new int[128];//默认初始化为0

       char ss, tt;
       int len = s.length();
       for(int i = 0; i < len; ++i) {
           ss = s.charAt(i);
           tt = t.charAt(i);
           if(key[ss]) {
               //如果ss在s中已经出现过且之前映射的字符与当前映射的字符tt不同,返回假
               if(map[ss] != tt) return false;
           }else {
               //如果ss在s中未出现过但已有其他key映射到了tt,返回假
               if(value[tt]) return false;
               //否则标记key和value,并存储它们之间的映射关系
               key[ss] = true;
               value[tt] = true;
               map[ss] = tt;
           }
       }

       return true;    
   }

你可能感兴趣的:(LeetCode,String,isomorphic)