骨骼清奇Word Games

Catalog:
LC 890 Find and Replace Pattern
LC 843 Guess the Word
LC 299 Bulls and Cows
LC 676 Implement Magic Dictionary

LC八就灵及其变种(找word pattern)
频率:8
Input: words = ["abc","deq","mee","aqq","dkd","ccc"], pattern = "abb"
Output: ["mee","aqq"]
1 <= words.length <= 50
1 <= pattern.length = words[i].length <= 20

分析:如何找到一个word的base pattern?每个字母又它在单词里第一次出现的位置作为id。

'aba' -> [0,1,0]
'abb' -> [0,1,1]

#beat 99%
class Solution:
    def findAndReplacePattern(self, words, pattern):
        """
        :type words: List[str]
        :type pattern: str
        :rtype: List[str]
        """
        def BaseP(w):
            m = {}
            for c in w: m[c] = m.get(c, len(m))
            return "".join(chr(m[c] + 97) for c in w)
        p = BaseP(pattern)
        res = []
        for w in words:
            if len(w) == len(p) and BaseP(w) == p:
                res.append(w)
        return res

LC 843 Guess the Word [Freq: 9]
We need to call master.guess() less than 10 times to find out what is the secret word in the word list given.
Example 1:
Input: secret = "acckzz", wordlist = ["acckzz","ccbazz","eiowzz","abcczz"]
Explanation:
master.guess("aaaaaa") returns -1, because "aaaaaa" is not in wordlist.
master.guess("acckzz") returns 6, because "acckzz" is secret and has all 6 matches.
master.guess("ccbazz") returns 3, because "ccbazz" has 3 matches.
master.guess("eiowzz") returns 2, because "eiowzz" has 2 matches.
master.guess("abcczz") returns 4, because "abcczz" has 4 matches.

Solution: repeatedly choose a word to guess and eliminate all words that do not have the same number of matches as the chosen word. This is O(n) time and not O(n^2) because I don't check all pairs.

LC 299 Bulls and Cows
Input: secret = "1123", guess = "0111"
Output: "1A1B"
Explanation: The 1st 1 in friend's guess is a bull, the 2nd or 3rd 1 is a cow.
Each time your friend makes a guess, you provide a hint that indicates how many digits in said guess match your secret number exactly in both digit and position (called "bulls") and how many digits match the secret number but locate in the wrong position (called "cows").

Key: dict a "&" dict b operation will keep pars in a, the key of which appears in b.

    s, g = Counter(secret), Counter(guess)
    a = sum(i == j for i, j in zip(secret, guess))
    return '%sA%sB' % (a, sum((s & g).values()) - a)

LC 676 Implement Magic Dictionary
For the method buildDict, you'll be given a list of non-repetitive words to build a dictionary.
For the method search, you'll be given a word, and judge whether if you modify exactly one character into another character in this word, the modified word is in the dictionary you just built.

Input: buildDict(["hello", "leetcode"]), Output: Null
Input: search("hello"), Output: False
Input: search("hhllo"), Output: True
Input: search("hell"), Output: False
Input: search("leetcoded"), Output: False

Approach #1: Brute Force with Bucket-By-Length

class MagicDictionary(object):
    def __init__(self):
        self.buckets = collections.defaultdict(list)

    def buildDict(self, words):
        for word in words:
            self.buckets[len(word)].append(word)

    def search(self, word):
        return any(sum(a!=b for a,b in zip(word, candidate)) == 1
                   for candidate in self.buckets[len(word)])

Approach #2: Generalized Neighbors

class MagicDictionary(object):
    def _genneighbors(self, word):
        for i in xrange(len(word)):
            yield word[:i] + '*' + word[i+1:]

    def buildDict(self, words):
        self.words = set(words)
        self.count = collections.Counter(nei for word in words
                                        for nei in self._genneighbors(word))

    def search(self, word):
        return any(self.count[nei] > 1 or
                   self.count[nei] == 1 and word not in self.words
                   for nei in self._genneighbors(word))
class MagicDictionary():

    def __init__(self):
        self.trie = {}

    def buildDict(self, d):
        for word in d: 
            node = self.trie 
            for letter in word: 
                if letter not in node: 
                    node[letter] = {}
                node = node[letter] 
            node[None] = None 
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,269评论 19 139
  • 官网 中文版本 好的网站 Content-type: text/htmlBASH Section: User ...
    不排版阅读 4,537评论 0 5
  • --predict-output 根据检测方法,将返回值和统计表中的内容相比对,从而缩小检测范围,提高检测效率 统...
    Instu阅读 417评论 0 0
  • 星期五了,又是一个周末,尹秀鑫休假了,今晚做了一些作业,明天上午跟她妈妈要去书店买东西,这个周六不去舞蹈班了,她妈...
    地球与我同在阅读 78评论 0 0
  • 上周更新了最新的Mac OSX操作系统10.11.x,但是安装brew命令的时候出现如下两种错误: 网上找了半天找...
    Springer阅读 14,568评论 6 3