1. 程式人生 > >字元串同構

字元串同構

字元串同構

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