LeetCode #290 Word Pattern 單詞樣板(模式)

英文原文如下

Given a pattern and a string s, find if s follows the same pattern.

Here follow means a full match, such that there is a bijection between a letter in pattern and a non-empty word in s.

中文翻譯

給予一個模式 pattern 以及一個字串 s,確認 s 是否符合其模式。

這裡的「符合」表示的是完全符合,即模式中的字母與 s 中的非空單詞之間存在映射。

範例及題目限制

⭐其實題目就是要從pattern的一個英語字母對應到 s 的一個單字這樣

範例應該還算清楚,要是符合規則就回傳true,反則false


解題思路

這種對應類的題目肯定逃不開幾個選擇 – Dictionary、HashMap

這些相信大家都相當熟悉了吧

直接來看看解決方法

C# 解決方案

方案1

public class Solution {
    public bool WordPattern(string pattern, string s) {
        Dictionary<char,string> dict =   new Dictionary<char,string>();
        HashSet<string> hSet = new HashSet<string>();
        string[]res = s.Split(" ");

        if(res.Length != pattern.Length)
        {
            return false;
        }

        for(int i = 0; i< pattern.Length;i++)
        {
            var p = pattern[i];
            var r = res[i];
            if (!dict.ContainsKey(p))
            {
                if(hSet.Contains(r))
                {
                    return false;
                }
                dict.Add(p, r);
                hSet.Add(r);
            }
            else    //check if exists
            {
                if(r != dict[p])
                {
                    return false;
                }
            }
        }

        return true;
    }
}

第一段的 【res.Length != pattern.Length】是後面才加的,題目中確實沒提到數量可能不相等的狀況!

可以看到我們用Dictionary來儲存字母跟單字的對應

至於HashSet則是用來那個單字是否被其他字母對應過了

(一個字母只能對應一個單字,一個單字也只能被一個字母對應,是一對一的關係)

Java解決方案

方案1

class Solution {
    public boolean wordPattern(String pattern, String s) {
        Map<Character, String> dict = new HashMap<Character, String>();
        HashSet<String> hSet  = new HashSet<String>();

        String[]res = s.split(" ");

        if(res.length != pattern.length())
        {
            return false;
        }

        for(int i = 0; i< pattern.length();i++)
        {
            char p = pattern.charAt(i);
            String r = res[i];
            if (!dict.containsKey(p))
            {
                if(hSet.contains(r))
                {
                    return false;
                }
                dict.put(p, r);
                hSet.add(r);
            }
            else    //check if exists
            {
                if(!r.equals(dict.get(p)))
                {
                    return false;
                }
            }
        }

        return true;
    }
}

Python3 解決方案

方案1

class Solution:
    def wordPattern(self, pattern: str, s: str) -> bool:
        dict = {}
        hSet = set()
        res = s.split(" ")

        if(len(res) != len(pattern)):
            return False

        for i in range (len(pattern)):
            p = pattern[i]
            r = res[i]
            if (p not in dict):
                if(r in hSet):
                    return False
                
                dict[p] = r
                hSet.add(r)
            
            else:    #check if exists
                if(r != dict[p]):
                    return False

        return True

結論

如果有跟著前面的題目稍微做做,這一題應該算簡單?

像是之前講過的 LeetCode #387 First Unique Character in a String 字串中第一個唯一的字元

就用到了類似的作法

畢竟LeetCode的題目很常用到映射、對應…等這種的

所以Dictionary、HashSet這種類型的出場頻率相當之高

🧡如果這篇文章有幫上你的一點點忙,那是我的榮幸

🧡收藏文章或幫我點個廣告,那都是對我的支持

✅如有任何疑問,歡迎透過留言或messenger讓我知道 !

題目連結 : Word Pattern – LeetCode

其他的LeetCode文章

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *