In the video game Fallout 4, the quest "Road to Freedom" requires players to reach a metal dial called the "Freedom Trail Ring", and use the dial to spell a specific keyword in order to open the door.
Given a string
At the stage of rotating the ring to spell the key character key[i] :
- You can rotate the
ring clockwise or anticlockwise one place, which counts as 1 step. The final purpose of the rotation is to align one of the string ring's characters at the 12:00 direction, where this character must equal to the character key[i]. - If the character
key[i] has been aligned at the 12:00 direction, you need to press the center button to spell, which also counts as 1 step. After the pressing, you could begin to spell the next character in the key (next stage), otherwise, you've finished all the spelling.
Example:
Input: ring = "godding", key = "gd" Output: 4 Explanation:
For the first key character 'g', since it is already in place, we just need 1 step to spell this character.
For the second key character 'd', we need to rotate the ring "godding" anticlockwise by two steps to make it become "ddinggo".
Also, we need 1 more step for spelling.
So the final output is 4.
题目的意思大概是说旋转ring逐个拼出key字符串的字符(可以顺时针,逆时针旋转,旋转每经过 一个字符,所走的步数就要加1,最后按button确定时步数再加1),求最小步数。
刚看到这个题的时候,就考虑用动态规划来解,所以一直去思考它的状态转移过程。如果key中的某个字符在ring中多次出现,则所有这些字符对应key中的字符都表示一个状态,不能确定哪个状态是最优的,(因为最后优化的步数是累积的,所以可能当前走的步数较大,后面却很小),很难写出其状态转移公式,所以最后考虑用带记忆的dfs求解,用一个数组dp[ring.length()][key.length()],dp[i][j]表示ring中第i个字符(从0开始)在12点方向,要得到key中j以后所有字符(包含j)所需要的步数。