1,题目要求
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.
判断两个单词是不是同构的——也即两个单词是否能通过直接的字符替代而变成对方的形式。
2,题目思路
一开始,想到用hash,但是涉及到字符与出现数量,又想到了构建一个map。后来感觉这样比较麻烦,有觉得可以构建一个字符出现次序字符串,按顺序统计每一个字符出现的数量,比如egg,出现数量统计就是:12,apple,就是:1211。
但其实这样做是不满足题设条件的。题目的意思是不仅是字符的临近次序要一样,更重要的是字符出现的总次序也要一样才行。
譬如:applpe 和 ellpcr,如果只按照临近顺序来看,它们是满足条件的,但其实他们是不满足的条件的。
只有像applpe 和 ellplcr这样的才是满足的。
因此,题目也是可以直接用hash来做的,因为字符可以隐式地转换成数字的形式。而根据ascii表,最大的字符对应数字为127,因此只需要创建一个长度为为128的向量数组即可。
3,程序源码
class Solution {
public:
bool isIsomorphic(string s, string t) {
vector<int> ss(128,-1), tt(128,-1);
int len = s.size();
for(int i=0;i<len;i++)
{
if(ss[s[i]] != tt[t[i]])
return false;
ss[s[i]] = i;
tt[t[i]] = i;
}
return true;
}
};