字符串同构
题目描述:
给定两个字符串 s 和 t ,确定它们是否是同构的。
两个字符串是同构的如果 s 中的字符可以被替换得到 t。
所有出现的字符必须用另一个字符代替,同时保留字符串的顺序。 没有两个字符可以映射到同一个字符,但一个字符可以映射到自己。
注意事项:
你可以假定两个字符串 s 和 t 是一样长度的.
样例:
给出 s = “egg”, t= “add”, 返回 true。
给出 s = “foo”, t= “bar”, 返回 false。
给出 s = “paper”, t= “title”, 返回 true。
#include<bits/stdc++.h>
using namespace std;
bool isIsomorphic(string s, string t) {
// write your code here
int lens=s.length();
map<char,char>hashmap1;
int flag1=0;
for(int i=0;i<lens;i++)//s到t映射唯一性的判断
{
if(i==0){
hashmap1[s[i]]=t[i];
}else{
if(hashmap1.find(s[i])==hashmap1.end()){
hashmap1[s[i]]=t[i];
}else{
if(hashmap1[s[i]]!=t[i]){
flag1=1;
break;
}
}
}
}
map<char,char>hashmap2;
int flag2=0;
for(int i=0;i<lens;i++){//t到s映射唯一性的判断
if(i==0){
hashmap2[t[i]]=s[i];
}else{
if(hashmap2.find(t[i])==hashmap2.end()){
hashmap2[t[i]]=s[i];
}else{
if(hashmap2[t[i]]!=s[i]){
flag2=1;
}
}
}
}
if(flag1+flag2==0)//两个都唯一时,才同构
return true;
else
return false;
}
void travelmap(map<char,char>hashmap){//哈希表的遍历
map<char,char>::iterator iter;
for(iter = hashmap.begin(); iter != hashmap.end(); ++iter)
cout<<iter->first<<" "<<iter->second<<endl;
}
int main(){
string s,t;
cin>>s>>t;
cout<<isIsomorphic(s,t)<<endl;
return 0;
}
思路讲解:
由于,没有两个字符可以映射到同一个字符,即一对一的映射,所以我就想到了使用哈希表中的map函数,我们可以使用map将s[i]和t[i]对应的添加到哈希表中,但每次添加我们需要查找一下s[i]是否存在于哈希表中,如果不存在就添加,存在就看s[i]映射的字符是否与t[i]相等,如果不等则说明多个字符映射到同一个字符上了,故这两个字符不同构。但是这样我们只检查了s[i]到t[i]的映射,只确定了s[i]—->t[i]的唯一性,我们也要确定t[i]—->s[i]的映射是否唯一。只有这两个相互映射唯一,我们才能说这是同构的。
可能有些人会怀疑是否还需要对t到s的映射的唯一性进行判断,这里我给出一个反例就可以了,例eggs和adda,可以看出s到t的映射的唯一是唯一的,但是这两个字符串却不是同构的。所以我们还需要对t到s的映射的唯一性进行判断
举个例子:
例:egg与add
首先我们将e->a添加进哈希表,然后查找g是否存在哈希表中,不存在就将其g->d添加进哈希表,然后在判断g是否存在哈希表中,存在就将g映射的字符与d比较如果相同就说明s到t映射唯一,反之说明不唯一。然后我们也需要对t到s的映射的唯一性进行判断。这里就不一一描述了。
简单来说,互相添加映射就可以了