あなたは4つの円形のホイールと、あなたの目の前でロックを持っています。各ホイールは10個のスロットがあります '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'
。ホイールは自由に回転し、周りにラップすることができます。たとえば、私たちは変えることができます '9'
ように '0'
、または '0'
します '9'
。各移動は、一つの車輪1つのスロットを回すから成ります。
ロックは最初から始まり '0000'
、4輪の状態を表す文字列を。
あなたはのリスト与えられている deadends
ロックは、これらのコードのいずれかが表示されている場合、ロックの車輪が回転を停止し、あなたがそれを開くことができませんつまり、行き止まり。
与えられた target
ことは不可能である場合、ロックを解除し、ロックを開くのに必要な巻数の最小合計数を返す、または-1であろう車輪の値を表します。
例
例1:
Given deadends = ["0201","0101","0102","1212","2002"], target = "0202"
Return 6
Explanation:
A sequence of valid moves would be "0000" -> "1000" -> "1100" -> "1200" -> "1201" -> "1202" -> "0202".
Note that a sequence like "0000" -> "0001" -> "0002" -> "0102" -> "0202" would be invalid,
because the wheels of the lock become stuck after the display becomes the dead end "0102".
例2:
Given deadends = ["8888"], target = "0009"
Return 1
Explanation:
We can turn the last wheel in reverse to move from "0000" -> "0009".
通知
deadendsの1.長さ範囲内であろう [1, 500]
。
2. target
リストに表示されなくなります deadends
。
中3.Every文字列 deadends
と文字列は target
「9999」に万個の可能性「0000」から4桁の文字列になります。
パブリック クラスソリューション{ / ** * @paramのdeadends:deadendsのリスト * @paramの目標:ロックを解除します車輪の値 * @return :ターンの最小総数は * / パブリック INT openLock(文字列[] deadends、文字列ターゲット){ 文字列開始 = "0000" 。 // ここにコード書き の設定<文字列> deadSet = 新しい HashSetのを<> (); // エッジケース のための(文字列CUR:deadends){ もし(cur.equals(開始)){ リターン -1 。 } deadSet.add(CUR)。 } キューの<string>キュー= 新しい LinkedListの<> (); セット <文字列>訪問= 新しい HashSetの<> (); INTステップ= 0 。 queue.offer(スタート)。 visited.add(スタート)。 しばらく(!queue.isEmpty()){ int型のサイズ= queue.size(); 一方、(size--> 0 ){ 文字列CUR =queue.poll(); System.out.println(CUR)。 もし(cur.equals(ターゲット)){ 戻りステップと } のための(文字列NXT:getNextを(CUR、訪問、deadSet)){ queue.offer(NXT)。 visited.add(NXT)。 } } ステップ + = 1 ; } 戻り -1 。 } プライベートリストの<string> getNextを(文字列CUR、セットの<string>訪問、セットの<string> deadSet){ リストの<string> RES = 新規のArrayList <> (); 以下のために(INT ; I <cur.length(); iが0 = I ++ ){ 文字列NewStrによってすでに =ヘルパー(CUR、I、1 )。 もし(!!visited.contains(NewStrによってすでに)&& deadSet.contains(NewStrによってすでに)){ res.add(NewStrによってすでに); } NewStrによってすでに =ヘルパー(CUR、I、9 )。 もし(!!visited.contains(NewStrによってすでに)&& deadSet.contains(NewStrによってすでに)){ res.add(NewStrによってすでに); } } 戻りRES。 } プライベート文字列ヘルパー(文字列curが、int型 Iを、int型オフセット){ ストリングNewStrによってすでに = cur.substring(0、I)+(CHAR)((cur.charAt(I) - '0'オフセット+)10%+ '0')+ cur.substring(I + 1 )。 返すNewStrによってすでに、 } }