LeetCode 0205. 同构字符串

发布于:2023-01-12 ⋅ 阅读:(488) ⋅ 点赞:(0)

【LetMeFly】205.同构字符串

力扣题目链接:https://leetcode.cn/problems/isomorphic-strings/

给定两个字符串 s 和 t ,判断它们是否是同构的。

如果 s 中的字符可以按某种映射关系替换得到 t ,那么这两个字符串是同构的。

每个出现的字符都应当映射到另一个字符,同时不改变字符的顺序。不同字符不能映射到同一个字符上,相同字符只能映射到同一个字符上,字符可以映射到自己本身。

 

示例 1:

输入:s = "egg", t = "add"
输出:true

示例 2:

输入:s = "foo", t = "bar"
输出:false

示例 3:

输入:s = "paper", t = "title"
输出:true

 

提示:

  • 1 <= s.length <= 5 * 104
  • t.length == s.length
  • s 和 t 由任意有效的 ASCII 字符组成

方法一:哈希

使用两个哈希表:

  • 一个用来映射,记录s中的某个字符要映射为t的哪个字符。
  • 一个用来记录,记录t中的某个字符是否被映射过。

遍历一遍原始字符串,如果s中的当前字符已经被映射过了,就看t中当前字符是否和s上次映射的字符相同。如果不同就返回false

反之,如果s中出现了一个还没有被映射过的字符,那么就判断t中对应的字符是否已经被映射过。如果已经被别的字母映射过,那么就返回false,否则就建立映射。

遍历结束,返回true

  • 时间复杂度 O ( n ) O(n) O(n),其中 n n n是单个字符串的长度
  • 空间复杂度 O ( C ) O(C) O(C),其中 C C C是字符集的大小(本题为26)

AC代码

C++

class Solution {
public:
    bool isIsomorphic(string& s, string& t) {
        unordered_map<char, char> ma;  // 映射
        unordered_set<char> se;  // 出现过
        for (int i = t.size() - 1; i >= 0; i--) {  // 遍历
            if (ma.count(s[i])) {  // s[i]已经映射过
                if (ma[s[i]] != t[i])  // 看t[i]是否和上次映射的字符相同
                    return false;  // 不同就返回false
            }
            else {  // s[i]还没建立过映射
                if (se.count(t[i]))  // 如果t[i]已经被映射过了
                    return false;
                se.insert(t[i]);  // 建立映射
                ma[s[i]] = t[i];
            }
        }
        return true;
    }
};

总体效果还可以:result

同步发文于CSDN,原创不易,转载请附上原文链接哦~
Tisfy:https://letmefly.blog.csdn.net/article/details/126417676


网站公告

今日签到

点亮在社区的每一天
去签到