问题描述:
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.
For example,
Given "egg"
, "add"
, return true.
Given "foo"
, "bar"
, return false.
Given "paper"
, "title"
, return true.
Note:
You may assume both s and t have the same length.
class Solution {
public:
bool isIsomorphic(string s, string t) {
if(s.length() != t.length()) {
return false;
}
int *a=new int(s.length);
for( int i = 0; i < s.length(); i++) {
for( int j = 0; j<t.length(); j++ ) {
if( s[i] == s[j] && (t[i]-s[i]) != (t[j]-s[j]) ) {
return false;
}
}
}
return true;
}
};
上述方法超时。
改进:
class Solution {
public:
void arrset(int *a, int val, int length) {
for(int i=0; i<length; ++i) {
*(a+i)=val;
}
}
bool isIsomorphic(string s, string t) {
if(s.length() != t.length()) {
return false;
}
int *a=new int[255];
int *b=new int[255];
int *sub=new int[255];
arrset(a,0,255);
arrset(b,0,255);
arrset(sub,-1000,255);
for( int i = 0; i < s.length(); i++) {
int charA=s[i];
int charB=t[i];
if(a[charA] == 0 && b[charB] == 0) {
a[charA] = 1;
b[charB] = 1;
sub[charA] = s[i] - t[i];
//the case when s is "ab", t is "aa"
}
else {
if(s[i]-t[i] != sub[charA]){
return false;
}
}
}
return true;
}
};
改进by http://blog.csdn.net/brucehb/article/details/45378983
class Solution {
public:
bool isIsomorphic(string s, string t) {
int sTotTable[256];
int tTosTable[256];
int size = s.length();
for (int i = 0; i < 256; i++)
{
sTotTable[i] = 300;
tTosTable[i] = 300;
}
for (int i = 0; i < size; i++)
{
if (sTotTable[s[i]] == 300)
{
if (tTosTable[t[i]] == 300)
{
sTotTable[s[i]] = t[i];
tTosTable[t[i]] = s[i];
}
else
{
return false;
}