[LintCode] 796オープンロック

あなたは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によってすでに、
    } 
}

 

おすすめ

転載: www.cnblogs.com/xuanlu/p/12571950.html
おすすめ