Skip to content

Latest commit

 

History

History
92 lines (72 loc) · 2.54 KB

205.同构字符串.md

File metadata and controls

92 lines (72 loc) · 2.54 KB

205. 同构字符串

url

题目

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

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

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

输入:s = "egg", t = "add"
输出:true
输入:s = "foo", t = "bar"
输出:false
输入:s = "paper", t = "title"
输出:true

提示:

方法

  • 你可以想象成有两个柜子,分别是:indexOfSindexOfT
  • 每个柜子有很多层抽屉,那么比如eggadd,第一个字符的抽屉,分别是ea,由于是第一个字符,上一次的抽屉中的值是0,是满足条件的。并且在抽屉中存入i+1标签,也就是1
  • 当来到第二个字符的gd,也是满足条件的,因为第二个字符的抽屉中没有记录,并在抽屉中存入i+1,也就是2
  • 当来到第三个字符的gd,其实也是满足的,虽然第二个字符的抽屉中有记录,但是两个柜子的第二个字符的抽屉中的记录是一样的,因此,也更新i+1,假如不一样,那么就返回false

code

js

let isIsomorphic = (s, t) => {
    let indexOfS = [];
    let indexOfT = [];
    for (let i = 0; i < s.length; i++) {
        if (indexOfS[s[i]] !== indexOfT[t[i]]) {
            return false;
        }
        indexOfS[s[i]] = i + 1;
        indexOfT[t[i]] = i + 1;
    }
    return true;
};

console.log(isIsomorphic("egg", "add"));
console.log(isIsomorphic("foo", "bar"));
console.log(isIsomorphic("paper", "title"));

go

func isIsomorphic(s, t string) bool {
	indexOfS := make([]int, 256)
	indexOfT := make([]int, 256)
	for i := 0; i < len(s); i++ {
		if indexOfS[s[i]] != indexOfT[t[i]] {
			return false
		}
		indexOfS[s[i]] = i + 1
		indexOfT[t[i]] = i + 1
	}
	return true
}

java

class Solution {
    public boolean isIsomorphic(String s, String t) {
        int[] indexOfS = new int[256];
        int[] indexOfT = new int[256];
        for (int i = 0; i < s.length(); i++) {
            char sc = s.charAt(i), tc = t.charAt(i);
            if (indexOfS[sc] != indexOfT[tc]) {
                return false;
            }
            indexOfS[sc] = i + 1;
            indexOfT[tc] = i + 1;
        }
        return true;
    }
}