Python
 Computer >> コンピューター >  >> プログラミング >> Python

Pythonでターゲットを保持している最短のサイクル長を見つけるプログラム


有向グラフの隣接リストがあるとします。ここで、インデックスiの各リストは、ノードiからの接続されたノードで表されます。目標値もあります。ターゲットを含む最短サイクルの長さを見つける必要があります。解決策がない場合は-1を返します。

したがって、入力が次のような場合

Pythonでターゲットを保持している最短のサイクル長を見つけるプログラム

target =3.の場合、サイクルはノード1-> 2-> 3-> 1であるため、出力は3になります。別のサイクル0-> 1-> 2-> 3-> 0があることに注意してください。ただし、これは最短ではありません。

これを解決するには、次の手順に従います-

  • 訪問:=新しいセット
  • l:=要素ターゲットのリスト。
  • 長さ:=0
  • lが空ではない場合は、
    • 長さ:=長さ+ 1
    • nl:=新しいリスト
    • lの各uについて、
      • グラフ[u]の各vについて、
        • vがターゲットと同じ場合、
          • 戻りの長さ
        • vにアクセスした場合、
          • 次の反復に進む
        • vを訪問済みとしてマーク
        • nlの最後にvを挿入
    • l:=nl
  • 戻り値-1

理解を深めるために、次の実装を見てみましょう-

class Solution:
   def solve(self, graph, target):
      visited = set()
      l = [target]
      length = 0

      while l:
         length += 1
         nl = []
         for u in l:
            for v in graph[u]:
               if v == target:
                  return length
               if v in visited:
                  continue
               visited.add(v)
               nl.append(v)
         l = nl

      return -1

ob = Solution()
graph = [[1, 4],[2],[3],[0, 1],[]]
target = 3
print(ob.solve(graph, target))

入力

[[1, 4],[2],[3],[0, 1],[]]

出力

3

  1. Pythonで最長のアナグラムサブシーケンスの長さを見つけるプログラム

    2つの小文字の文字列SとTがあるとすると、最長のアナグラムサブシーケンスの長さを見つける必要があります。 したがって、入力がS =helloworld、T =hellorldの場合、出力は8になります これを解決するには、次の手順に従います- c:=新しいマップ、d:=新しいマップ 0からaのサイズの範囲のiの場合、実行 cのa[i]の場合、 c [a [i]]:=c [a [i]] + 1 それ以外の場合 c [a [i]]:=1 0からbのサイズの範囲のiの場合、実行 dのb[i]の場合、 d [b [i]]:=

  2. Pythonで最も長いバランスの取れたサブシーケンスの長さを見つけるプログラム

    括弧「(」および「)」を含む文字列sがあるとすると、バランスの取れた括弧の最長のサブシーケンスの長さを見つける必要があります。 したがって、入力がs =())(()(の場合、出力は4になります。これは、 ()()のようなサブシーケンスを取ることができるためです。 これを解決するには、次の手順に従います- res:=0 n:=sのサイズ close:=0 n-1から0の範囲のiの場合、1ずつ減らします。 s[i]が)と同じ場合、 close:=close + 1 それ以外の場合 0の場合、 close:=close-1 r