美文网首页每日一练
每日一练(43):同构字符串

每日一练(43):同构字符串

作者: 加班猿 | 来源:发表于2022-04-15 11:22 被阅读0次

    title: 每日一练(43):同构字符串

    categories:[剑指offer]

    tags:[每日一练]

    date: 2022/04/15


    每日一练(43):同构字符串

    给定两个字符串 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 字符组成

    来源:力扣(LeetCode)

    链接:https://leetcode-cn.com/problems/isomorphic-strings

    方法一

    思路分析

    t.length == s.length 所以无需考虑长度

    相同的字符用find找到的index一定是一样的

    利用这点我们可以利用find来验证是否pattern相同

    1. 假设有foo和baa,当我们到最后一个index时s里找'o'和t里找'a'一定会返回

    2. 相同的index,因为之前已经出现过了,这里s里的'o'跟t里的'a'都会返回index 1

    3. 再假设我们有foo和bar,'fo'和'ba'是没有问题的,但是当我们到最后一个index时

    4. s里的'o'会返回1,因为之前已经出现过,而t里的'r'会返回2,因为之前并没有

    5. 出现过这个字母,这样就可以验证他们的pattern是否相同

    bool isIsomorphic(string s, string t) {
        for (int i = 0; i < s.size(); ++i) {
            if (s.find(s[i]) != t.find(t[i])) {
                return false
            }
        }
        return true;
    }
    

    方法二

    思路分析

    为具有对应关系的字符连边并赋予权值,初始值为 0 表示未有映射关系,同为 0 才能连边

    因此如果是同构字符串,每对字符的值应该相等

    bool isIsomorphic(string s, string t) {
        int sm[128] = {0};
        int tm[128] = {0};
        for (int i = 0; i < s.size(); i++) {
            if (sm[s[i]] != tm[t[i]]) {
                return false;
            }
            sm[s[i]] = tm[t[i]] = i + 1;
        }
        return true;
    }
    

    相关文章

      网友评论

        本文标题:每日一练(43):同构字符串

        本文链接:https://www.haomeiwen.com/subject/givfertx.html