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


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):同构字符串)