[解答]プログラマー-Lv 3単語変換


プログラマ-Lv 3単語変換


1.質問


https://programmers.co.kr/learn/courses/30/lessons/43163

2.考慮事項


一度に1つのアルファベット
  • しか置き換えられません.
  • 個の単語にしか変換できません.
  • 各単語はアルファベット小文字のみで構成されます.
  • 各単語の長さは3または10を超えず、すべての単語の長さは同じである.
  • 個の単語は3個または50個以上の単語があり、重複する単語はありません.
  • beginとtargetは異なります.
  • が変換できない場合は0を返します.
  • I/O例
    begintargetwordsreturn"hit""cog"["hot", "dot", "dog", "lot", "log", "cog"]4"hit""cog"["hot", "dot", "dog", "lot", "log"]0

    3.解答

  • の最短距離を求めるにはBFS方式を用いたが,それは有用であるからである.
  • の単語リストで、現在の単語とアルファベット数とは異なる単語をキューに入れます.
  • 単語をキューに入れ、step(フェーズ)も1を増やします.
  • キューに配置された単語は、重複アクセスを防ぐために単語リストから削除されます.
  • 個の単語の長さが50個以下なので、単語リストから削除する方法を選びましたが、数が大幅に増えるとアクセスの有無をチェックする方法が使えるはずです.
  • キューの要素を前面から取り出し、ターゲットと一致しているかどうかを確認し、一致している場合はstepに戻ります.
  • 4.草コード

    from collections import deque
    
    
    def bfs(begin, target, words):
        size = len(begin)
        queue = deque([(begin, 0)])
    
        while queue:
            word, step = queue.popleft()
    
            if word == target:
                return step
    
            for compare_word, compare_step in words:
                diff = 0
    
                for i in range(size):
                    if diff > 1:
                        break
    
                    if word[i] != compare_word[i]:
                        diff += 1
    
                if diff == 1:
                    queue.append((compare_word, step + 1))
    
        return 0
    
    
    def solution(begin, target, words):
        words = list(zip(words, [0] * len(words)))
        return bfs(begin, target, words)

    5.学んだこと

  • 最短距離はやはりBFS方式を使いましょう!