letecode [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.

Example 1:

Input: s = "egg", t = "add"
Output: true

Example 2:

Input: s = "foo", t = "bar"
Output: false

Example 3:

Input: s = "paper", t = "title"
Output: true

题目大意

  判断两个字符串是否同构,若两字符串间的字符可以唯一映射,则同构。

理  解:

  方法一:辅助空间

    用map保存映射关系。若s[i]出现在map中,则判断当前映射是不是s[i]->t[i],不是则返回false。

    若不在map中,判断t[i]是否已被其他字符映射(保存在set中),若已被映射,则为false。

    其他情况,往后比较其余字符。

  方法二:直接判断

    这是其他人的方法,判断相同字符串是否在相同的位置出现。

    以s[i]为依据,若s[i]==s[j],则理应t[i]==t[j]才满足映射。

代 码 C++:方法一:

class Solution {
public:
    bool isIsomorphic(string s, string t) {
        int i;
        map<char,char> m;
        map<char,char>::iterator it;
        set<char> st;
        i = 0;
        
        while(s[i]!='\0'){
           
            it = m.find(s[i]);
            if(it == m.end()){
                if(st.count(t[i])==1)
                    return false;
                m.insert(pair(s[i],t[i]));
                st.insert(t[i]);
            }else{
                if(it->second == t[i]){
                    ++i;
                }else{
                    return false;
                }
            }           
        }
        return true;
    }
};

方法二:

class Solution {
public:
    bool isIsomorphic(string s, string t) {
       if(s.size()!=t.size())
            return false;
        for(int i=0;i<s.size();i++)
        {  //直接过滤后面相同的字符
            if(s.find(s[i])!=t.find(t[i]))
                return false;
        }
        return true;

    }
};

运行结果:

方法一:执行用时 :16 ms, 在所有C++提交中击败了73.23%的用户

    内存消耗 :9.2 MB, 在所有C++提交中击败了23.89%的用户
 
方法二:执行用时 :12 ms, 在所有C++提交中击败了94.03%的用户
    内存消耗 :9 MB, 在所有C++提交中击败了51.99%的用户
posted @ 2019-06-13 15:03  lpomeloz  阅读(103)  评论(0编辑  收藏  举报