zoukankan      html  css  js  c++  java
  • 205. Isomorphic Strings

    题目:

    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.

    For 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.

    链接:  http://leetcode.com/problems/isomorphic-strings/

    题解:

    一开始的想法就是使用HashMap,试了一下发现必须一一对应,所以想到了类似电话簿,建立两个hashmap来保存这种一一对应的关系。

    Time Complexity - O(n), Space Complexity - O(1)。

    public class Solution {
        public boolean isIsomorphic(String s, String t) {
            if(s == null || t == null ||  s.length() != t.length())
                return false;
        
            Map<Character, Character> st = new HashMap<>();
            Map<Character, Character> ts = new HashMap<>();
            
            for(int i = 0; i < s.length(); i++) {
                if(!st.containsKey(s.charAt(i))) {
                    st.put(s.charAt(i), t.charAt(i));
                } else {
                    if(st.get(s.charAt(i)) != t.charAt(i))
                        return false;
                }
                if(!ts.containsKey(t.charAt(i))) {
                    ts.put(t.charAt(i), s.charAt(i));
                } else {
                    if(ts.get(t.charAt(i)) != s.charAt(i))
                        return false;
                }
            }
            
            return true;
        }
    }

    还有更好的写法,就是开一个到两个array,然后比较ASCII,这样应该能算是O(1)和O(1)。二刷要多学习。

    二刷:

    使用GrandYong的写法,使用两个bitmap,然后存储sChar和tChar的位置, 注意 sMap[sChar] = i + 1和tMap[tChar] = i +1是为了区别初始的0。假如我们初始化数组都等于-1的话,就可以不用+1。不过这个也无关紧要

    Java:

    Time Complexity - O(n), Space Complexity - O(1)。

    public class Solution {
        public boolean isIsomorphic(String s, String t) {
            if (s == null || t == null || s.length() != t.length()) {
                return false;
            }
            int[] sMap = new int[256], tMap = new int[256];
            for (int i = 0; i < s.length(); i++) {
                char sChar = s.charAt(i);
                char tChar = t.charAt(i);
                if (sMap[sChar] != tMap[tChar]) {
                    return false;
                }
                sMap[sChar] = i + 1;   // to differential case 0, 0
                tMap[tChar] = i + 1;
            }
            return true;
        }
    }

    三刷:

    Java:

    对Unicode还是要用两个hashMap。 Space Complexity, 即使是Unicode也只是小常数,所以还是算O(1)。

    Time Complexity - O(n), Space Complexity - O(1)。

    public class Solution {
        public boolean isIsomorphic(String s, String t) {
            if (s == null || t == null || s.length() != t.length()) {
                return false;
            }
            Map<Character, Character> st = new HashMap<>();
            Map<Character, Character> ts = new HashMap<>();
            
            for (int i = 0; i < s.length(); i++) {
                char sChar = s.charAt(i);
                char tChar = t.charAt(i);
                if ((st.containsKey(sChar) && st.get(sChar) != tChar) || (ts.containsKey(tChar) && ts.get(tChar) != sChar)) {
                    return false;
                } 
                if (!st.containsKey(sChar)) {
                    st.put(sChar, tChar);    
                }
                if (!ts.containsKey(tChar)) {
                    ts.put(tChar, sChar);    
                }
            }
            return true;
        }
    }

    假设Alphabet为Single-byte char,我们就可以使用bitmap,速度大大提高。这里是对每个元素的出现位置进行比较,并且使用的是 1- based index来避免 array数组初始化的0。每次遇到两个字符,我们就去sMap和tMap中来比较它们上一次的出现的位置是否相同,假如不通的话我们就返回false。

    Time Complexity - O(n), Space Complexity - O(1)。

    public class Solution {
        public boolean isIsomorphic(String s, String t) {
            if (s == null || t == null || s.length() != t.length()) {
                return false;
            }
            int[] sMap = new int[256];
            int[] tMap = new int[256];
            
            for (int i = 0; i < s.length(); i++) {
                char sChar = s.charAt(i);
                char tChar = t.charAt(i);
                if (sMap[sChar] != tMap[tChar]) {
                    return false;
                }
                sMap[sChar] = i + 1;
                tMap[tChar] = i + 1;
            }
            return true;
        }
    }

    Reference:

    https://leetcode.com/discuss/33889/short-java-solution-without-maps

    https://leetcode.com/discuss/55777/fast-java-solution-using-ascii-code

  • 相关阅读:
    非系统服务如何随系统启动时自动启动(rc.local加了可执行权限,仍然没有生效)
    centos7安装部署mysql5.7服务器
    centos7配置openldap服务器
    MySQL之高可用MHA部署
    root用户登录mysql后新建用户提示1045错误
    centos7上部署vnc服务器并实现远程桌面
    xenserver开启虚拟机时提示找不到存储介质,强制关闭和重启都没用
    固态硬盘和机械硬盘双硬盘安装win10,提示无法找到系统
    centos7安装的mysql无法启动(mysql daemon failed to start)
    实现在同一界面打开putty终端连接工具
  • 原文地址:https://www.cnblogs.com/yrbbest/p/4493545.html
Copyright © 2011-2022 走看看