力扣地址: 205. 同构字符串
题目描述:
给定两个字符串 s 和 t,判断它们是否是同构的。
如果 s 中的字符可以被替换得到 t ,那么这两个字符串是同构的。
所有出现的字符都必须用另一个字符替换,同时保留字符的顺序。两个字符不能映射到同一个字符上,但字符可以映射自己本身。
示例 1:
输入: s = "egg", t = "add"
输出: true
示例 2:
输入: s = "foo", t = "bar"
输出: false
示例 3:
输入: s = "paper", t = "title"
输出: true
说明:
你可以假设 s 和 t 具有相同的长度。
思路:
设计一个map映射,从s的每个字符映射到到t的每个字符,如果根据key(s[i]字符)找到value,则判断value是否是之前插入的t[i]字符,如果找不到则插入(s[i],t[i])键值对。
还得保证s字符串和t字符串中的字符应该一一对应,所以还需要unique去重。
注意:unique()是剔除重复的没错,可是他是剔除相邻之间字符重复的,str中的字符前后之间是没有重复的,所以unique函数是起不到作用的。
代码
class Solution {
public:
bool isIsomorphic(string s, string t) {
s.erase(unique(s.begin(), s.end()), s.end());
t.erase(unique(t.begin(), t.end()), t.end());
if(s.length()!=t.length())
return false;
else
{
map<char, char> ab_map;
for(int i = 0; i < s.length(); ++i)
{
char a = s[i];
char b = t[i];
if(ab_map.find(a) != ab_map.end())
{
if(ab_map[a] != b)
return false;
else
continue;
}
else
ab_map.insert(make_pair(a, b));
}
}
return true;
}
};
代码可以小改一下
class Solution {
public:
bool isIsomorphic(string s, string t) {
s.erase(unique(s.begin(), s.end()), s.end());
t.erase(unique(t.begin(), t.end()), t.end());
if(s.length()!=t.length())
return false;
map<char, char> m;
for(int i = 0; i<s.length(); i++)
{
if(m.find(s[i]) != m.end() && m[s[i]] != t[i])
{
return false;
}
else if(m.find(s[i]) != m.end() && m[s[i]] == t[i])
{
continue;
}
else{
m[s[i]] = t[i];
}
}
return true;
}
};