LeetCode (35) Isomorphic Strings

来源:互联网 发布:java编程思想第四版 编辑:程序博客网 时间:2024/05/26 08:41

题目描述

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.
  • Given “ab”, “aa”, return false. ⇒ a->a and b->a

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

本题比较简单,不必考虑两个字符串长度不同的情况。遍历字符串,使用map得到两个字符串中字符的映射,若新出现的字符对与map中保存的不同,则返回false。

需要注意,使用一个map对于 “ab”, “aa” 的情况可能无法判断,因为从a->a 和 b->a的key是不一样的,在map中无法查找到,而反过来则是 a->a 和 a->b显然是错误的,因此,我们可以对两个字符串分别作为map的key,进行两次判断,避免错误的发生。

另一种做法是,仅使用一个字符串作为map的key,但是使用一个set保存每个key的value。若处理完成后,set中元素个数小于map元素个数,则说明存在两个不同的key映射到了同一个value情况,返回false.

代码

class Solution {public:    bool isIsomorphic(string s, string t) {        if(s.size() != t.size())            return false;        unordered_map<char, char> stringMap;        for(size_t i = 0; i != s.size(); ++i)        {            char sc = s[i];            char tc = t[i];            if (stringMap.find(sc) == stringMap.end())            {                stringMap[sc] = tc;            }            else            {                if (stringMap[sc] != tc)                    return false;            }        }        unordered_set<char> stringSet;        unordered_map<char, char>::iterator it = stringMap.begin();        for(; it != stringMap.end(); ++it)        {            if (stringSet.find(it->second) != stringSet.end())                return false;            else                stringSet.insert(it->second);        }        return true;    }};
0 0
原创粉丝点击