zoukankan      html  css  js  c++  java
  • Java实现 LeetCode 514 自由之路

    514. 自由之路

    视频游戏“辐射4”中,任务“通向自由”要求玩家到达名为“Freedom Trail Ring”的金属表盘,并使用表盘拼写特定关键词才能开门。

    给定一个字符串 ring,表示刻在外环上的编码;给定另一个字符串 key,表示需要拼写的关键词。您需要算出能够拼写关键词中所有字符的最少步数。

    最初,ring 的第一个字符与12:00方向对齐。您需要顺时针或逆时针旋转 ring 以使 key 的一个字符在 12:00 方向对齐,然后按下中心按钮,以此逐个拼写完 key 中的所有字符。

    旋转 ring 拼出 key 字符 key[i] 的阶段中:

    您可以将 ring 顺时针或逆时针旋转一个位置,计为1步。旋转的最终目的是将字符串 ring 的一个字符与 12:00 方向对齐,并且这个字符必须等于字符 key[i] 。
    如果字符 key[i] 已经对齐到12:00方向,您需要按下中心按钮进行拼写,这也将算作 1 步。按完之后,您可以开始拼写 key 的下一个字符(下一阶段), 直至完成所有拼写。
    示例:
    在这里插入图片描述

    输入: ring = “godding”, key = “gd”
    输出: 4
    解释:
    对于 key 的第一个字符 ‘g’,已经在正确的位置, 我们只需要1步来拼写这个字符。
    对于 key 的第二个字符 ‘d’,我们需要逆时针旋转 ring “godding” 2步使它变成 “ddinggo”。
    当然, 我们还需要1步进行拼写。
    因此最终的输出是 4。
    提示:

    ring 和 key 的字符串长度取值范围均为 1 至 100;
    两个字符串中都只有小写字符,并且均可能存在重复字符;
    字符串 key 一定可以由字符串 ring 旋转拼出。

    Ps:
    DP【i】【j】指的是key第i个字符匹配的轮盘的第j个数字
    因为我是两边转,在dp基础上加一个判断正反最小的

    class Solution {
     
    
     public int findRotateSteps(String ring, String key) {
       
    char[] sring = ring.toCharArray();
        char[] skey = key.toCharArray();
        int[][] dp = new int[key.length()][ring.length()];
         for(int i = 0 ; i < dp.length ; i ++){
            Arrays.fill(dp[i], Integer.MAX_VALUE);
        }
        int n = ring.length();
        int count = Integer.MAX_VALUE;
        for(int i = 0 ; i < skey.length ; i ++) {
            for(int j = 0 ; j < n; j ++){
                if(skey[i] == sring[j]){
                    if(i == 0)
                        dp[i][j] = Math.min(j, n - j);
                    else{
                        for(int k = 0 ; k < n ; k ++){
                            if(dp[i - 1][k] != Integer.MAX_VALUE){
                                dp[i][j] = Math.min(dp[i][j], dp[i - 1][k] + Math.min(Math.abs(j - k), n - Math.abs(j - k)));
                            }
                        }
                    }
                    
                    if(i == skey.length - 1)
                        count = Math.min(count, dp[i][j]);
                }
            }
        }
        return count + skey.length;
    }
    
  • 相关阅读:
    108. Convert Sorted Array to Binary Search Tree
    107. Binary Tree Level Order Traversal II
    106. Construct Binary Tree from Inorder and Postorder Traversal
    105. Construct Binary Tree from Preorder and Inorder Traversal
    104. Maximum Depth of Binary Tree
    103. Binary Tree Zigzag Level Order Traversal
    102. Binary Tree Level Order Traversal
    系统和进程相关信息
    文件I/0缓冲
    系统编程概念(文件系统mount等函数的使用)
  • 原文地址:https://www.cnblogs.com/a1439775520/p/13074987.html
Copyright © 2011-2022 走看看