アルゴリズム:変換プログラマの単語


質問する
2つの単語begin、target、単語の集合語があります.次のルールを使用して、beginからtargetに変換する最短変換プロセスを検索します.
一度に1つのアルファベット
  • しか置き換えられません.
  • 個の単語にしか変換できません.
    たとえば、beginがhit、targetがcog、単語が[hot、dog、lot、log、cog]の場合、hit->hot->dot->dogなどの4つのステップで変換できます.
  • 2つの単語begin、target、および単語の集約語をパラメータとして指定する場合は、少なくともいくつかのステップを経てbeginをtargetに変換するには、解法関数を記述します.
    I/O例
    begin target words return
    hit cog [hot, dot, dog, lot, log, cog] 4
    hit cog [hot, dot, dog, lot, log] 0
    I/O例説明
    例1
    問題の例は次のとおりです.
    例2
    単語にないため、ターゲットcogを変換できません.
    に答える
    これは簡単な質問で、begin単語をtarget単語に変換するにはいくつかのステップが必要です.
    単語は一度に1文字しか変えられない.
    だから今の単語とは違う単語を探すために、
    現在の単語と逐字比較しようとすると,他の単語の総数が1つであれば返す.
    ここにはPythonジェネレータと生産量の概念があります.
    関数Aで順次返す収益率値が定義されている場合、関数Aは反復可能オブジェクト、ジェネレータとなります.
    したがってgenerator「get neign()」は、条件を満たす要素をクエリーし、distに書き込み、キューに格納します.キューに条件を満たす要素がない場合、distは書き込みターゲットのステップを返します.
    from collections import deque
    
    
    def get_adjacent(current, words):
        for word in words:
            
            count = 0
            for c, w in zip(current, word):
                if c != w:
                    count += 1
    
            if count == 1:
                yield word
    
    
    def solution(begin, target, words):
        dist = {begin: 0}
        queue = deque([begin])
    
        while queue:
            current = queue.popleft()
    
            for next_word in get_adjacent(current, words):
                if next_word not in dist:
                    dist[next_word] = dist[current] + 1
                    queue.append(next_word)
    
        return dist.get(target, 0)
    Thought:
    最近は検索アルゴリズムのリズムを見ていて、初めて見たときも「アクセス」などの表現は感じられませんでした.
    だから直接問題と解答を見て勉強します.
    このプールはプログラマのpython 3の最上位にあります.
    ZipやEyieldなどのPython機能の使用はとても良いです.