LeetCode 205. Isomorphic Strings; 290. Word Pattern; 890. Find and Replace Pattern

Posted 約束の空

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode 205. Isomorphic Strings; 290. Word Pattern; 890. Find and Replace Pattern相关的知识,希望对你有一定的参考价值。

这几道题都是pattern的题目, Isomorphic Strings 和 Word Pattern 是完全一样的问题,Find and Replace Pattern 本质也一样。

第一种思路,建立两个map,将字符(或字符串)映射到所在的位置 i+1,每次只需要判断 map1[a]==map2[b],大概思路是这样。

bool isIsomorphic(string s, string t) {
        char map_s[128] = { 0 };
        char map_t[128] = { 0 };
        int len = s.size();
        for (int i = 0; i < len; ++i)
        {
            if (map_s[s[i]]!=map_t[t[i]]) return false;
            map_s[s[i]] = i+1;
            map_t[t[i]] = i+1;
        }
        return true;    
    }

 

我个人比较倾向第二种思路,a->b ,每个a[i]只能对应b[i],因此我们建立一个hashtable,hash[b[i]]只可能是一个数。但是这样存在一个问题,如果如果同时a->b a->c,也是不行的。可以再建立一个映射b->a的hashtable,也可以建立一个set,每个a[i]只能建立一次映射,用set保存。

205. Isomorphic Strings

class Solution {
public:
    bool isIsomorphic(string s, string t) {
        //s->t  hash[t] is unique, s can only map to one char
        if (s.size()!=t.size()) return false;
        unordered_map<char,char> hash;
        unordered_set<char> a;
        for (int i=0;i<s.size();++i){          
            if (hash.count(t[i])){
                if (hash[t[i]]!=s[i])
                    return false;
            }else{
                hash.insert({t[i],s[i]});
                if (a.count(s[i])) return false;
                else a.insert(s[i]);
            }
        }
        return true;
    }
};

 

290. Word Pattern

class Solution {
public:
    bool wordPattern(string pattern, string str) {
        istringstream in(str);
        unordered_map<string,char> hash;
        unordered_set<char> s;
        int i=0;
        for (string word;in>>word;++i){
            if (i==pattern.size()) return false;
            if (hash.count(word)){
                if (hash[word]!=pattern[i]) return false;
            }else{
                hash[word] = pattern[i];
                if (s.count(pattern[i])) return false;
                else s.insert(pattern[i]);
            }
        }
        return i==pattern.size();
    }
};

 

890. Find and Replace Pattern

class Solution {
public:
    vector<string> findAndReplacePattern(vector<string>& words, string pattern) {
        vector<string> res;
        for (string word:words){
            if (word.size()!=pattern.size()) continue;
            unordered_map<char,char> hash;
            unordered_set<char> s;
            bool flag=true;
            for (int i=0;i<pattern.size();++i){ // pattern->word   hash[word[i]] unique
                if (!hash.count(word[i])){
                    hash.insert({word[i],pattern[i]});
                    if (s.count(pattern[i])) {flag=false; break;}
                    else s.insert(pattern[i]);
                }
                else if (hash[word[i]]==pattern[i])
                    continue;
                else{
                    flag = false;
                    break;
                }
            }
            if (flag) res.push_back(word);
        }
        return res;
    }
};

 

以上是关于LeetCode 205. Isomorphic Strings; 290. Word Pattern; 890. Find and Replace Pattern的主要内容,如果未能解决你的问题,请参考以下文章

[LeetCode] 205 Isomorphic Strings

205. Isomorphic Strings(LeetCode)

LeetCode 205. Isomorphic Strings

LeetCode 205 Isomorphic Strings

LeetCode 205 Isomorphic Strings

LeetCode205. Isomorphic Strings