Description
Example
Note
Solution 1(C++)
class Solution {
public:
bool isIsomorphic(string s, string t) {
if(s.size()!=t.size()){return false;}
string models=model(s);
string modelt=model(t);
return models.compare(modelt)==0;
}
string model(string& a){
char mark='a';
string tool(a.size(),'0');
for(int i=0;i<a.size();i++){
if(tool[i]=='0'){
size_t found=a.find(a[i]);
while(found!=string::npos){
a[found]=mark;tool[found]='1';
found=a.find(a[i],found+1);
}
mark++;
}
else continue;
}
return a;
}
};
Solution 2(C++)
class Solution {
public:
bool isIsomorphic(string s, string t) {
int m1[256] = {0}, m2[256] = {0}, n = s.size();
for (int i = 0; i < n; ++i) {
if (m1[s[i]] != m2[t[i]]) return false;
m1[s[i]] = i + 1;
m2[t[i]] = i + 1;
}
return true;
}
};
算法分析
解法一: 解法一是错误的。
解法二: 解法二是正确的。解法二就是要保证对于s与t,在同一位置上,该字母出现的次数相同。值得学习。比如,对于“abb”与“cdd”。那么对于这两个字符串,第一个位置,一个是“a”,一个是“c”,二者都单独出现了一次,往后看,对于第二个位置,一个是“b”,一个是“d”,二者也单独出现一次,没问题,再往后看,对于第三个位置,一个是“b”,一个是“d”,二者之前均出现了一次,也是一样的,所以也没有问题。如果换成“abbc”与“cddd”,那么在第四个位置上,一个是“c”,一个是“d”,一个之前没有出现过,一个之前出现了三次。所以返回false。
程序分析
之所以纠结于解法一很长时间,是因为想接这一次好好练习一下之前总结的String相关函数。但是呢,还是把问题做复杂了。可以学一学解法二的思想。