Isomorphic Strings
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.show tags: hash table
//C++
class Solution {
public:
bool isIsomorphic(string s, string t) {
};
题目的意思就是给你2个string,如果他们都是 ABB 类型 , ABBCDD 类型……,就返回true 否则返回 false
也就是说相同位置的字母要一样
刚开始我想的是替换
比如 paper 和 title
第一遍拿到 p 和 t
然后循环一次 paper 将其中所有的p 替换成t
第二遍拿到 a 和 i
循环 paper 将其中所有的a替换成i
第二个想法是 26个字母,就用 a[26],全部初始化为0
第一个字母就在 a[0]+1, 后面相同字母再+1,不同存入a[1],a[2]
最后比较2个数组
感觉第一个比较好写,就写了第一个
class Solution {
public:
bool isIsomorphic(string s, string t) {
int length = s.length();
char c1, c2;
for (int i = 0; i < length; i++)
{
c1 = s[i];
c2 = t[i];
for (int j = 0; j < length; j++)
{
if (s[j]==c1)
{
s[j] = c2;
}
}
}
if (s == t)
return true;
else
return false;
}
};
结果没通过,它上面的测试数据是很长很长的一串各种字符都有的东西
看了下提示,是Hash Table,这才想到之前的第二种想法和hash table 挺像的
而且还想的比 Hash 麻烦,最后用Hash 表的方法写了另外一个方法通过OJ
class Solution {
public:
bool isIsomorphic(string s, string t) {
int a[256] = { 0 }, b[256] = {0};
for (int i = 0; i < s.length(); i++)
{
if (a[s[i]] > 0 || b[t[i]] > 0)
{
if (a[s[i]] = b[t[i]])
continue;
else
return false;
}
else{
a[s[i]] = i + 1;
b[t[i]] = i + 1;
}
}
return true;
}
};
初始化 2个数组 全部存0
第一次遇到字母,会存入相应的位置,并且存入值为i+1,保证各个下标的值均不同,之后再次遇到相同(也就是 a[s[i]] > 0 || b[t[i]] > 0 )则会比较其位置的值是否相等