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.
方法一:利用容器的对应关系,建两个容器,一个是s作为键,t作为值;另一个t作为键,s作为值;这两个容易的对应一样就是true
bool isIsomorphic(string s, string t)
{
if(s.length()!=t.length()) return false;
if(s.length()==t.length()==NULL) return true;
map<char,char> mapings_t;
map<char,char> mapingt_s;
int len=s.length();
for(int i=0;i<len;)
{
mapings_t.insert(map<int,int>::value_type(s[i],t[i]));
mapingt_s.insert(map<int,int>::value_type(t[i],s[i]));
if(mapings_t.count(s[i])!=mapingt_s.count(t[i])) return false;
if(mapings_t.count(s[i])==0) i++;
else
{
if(mapings_t.find(s[i])->second==t[i]&&mapingt_s.find(t[i])->second==s[i]) i++;
else return false;
}
}
return true;
}
方法二:由于容器的查找的效率比较低,下面使用数组来实现哈希表。由于char有256个字符,建256大小的数组就可以了
public:
bool isIsomorphic(string s, string t) {
int table1[256] = { 0 };
int table2[256] = { 0 };
string temp;
for (int i = 0; i < s.size(); i++){
if (table1[s[i]] == 0) table1[s[i]] = t[i];
if (table2[t[i]] == 0) table2[t[i]] = s[i];
else if (s[i] != table2[t[i]]) return false;
temp.push_back(table[s[i]]);
}
if (temp == t) return true;
else return false;
}