字元串同構
字元串同構
題目描述:
給定兩個字串 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的對映的唯一性進行判斷。這裡就不一一描述了。
簡單來說,互相新增對映就可以了