LeetCode (35) 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.
  • 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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值