题目: 力扣514 : 自由之路 . - 力扣(LeetCode)
题目的详细描述,直接打开力扣看就是了,下面说一下我对题目的理解:
事例1:
输入: ring = "godding", key = "gd" 输出: 4.
1. ring的第一个字符默认是指向12点方向的,这一点很重要
2. key的第一个字符为g,而ring中首字符和末尾字符都为g。因此,必然存在选择首字符的g还是末尾字符g的问题。
3. 即使ring中第一个字符为g,也还存在存在顺时针旋转和逆时针旋转的问题。(当然,当前案例比较极端,如果第一个字符不为g,理解起来更合适)
4. 这一题要求的是旋转的最小步数。因此,最终的值必然是获取最小值的。
5. 那么整体串起来分析:
ring = "godding", key = "gd"
字符 | g | o | d | d | i | n | g |
下标 | 0 | 1 | 2 | 3 | 4 | 5 | 6 |
a1. 如果ring的第一个g旋转,顺时针步数为0;逆时针步数为7;算上最终确认的1步,因此就 是在 1 和 8中选取最小值,选取1
a2. 接着a1继续分析,既然key的第一个字符已经确定了。那么key的第二个字符d又该选择 了。我们到底是用下标为2的d呢,还是使用下标为3的d呢?
选择1: 下标为2的d,从a1的g顺时针旋转只需要2步,逆时针旋转需要5步,。算上确认的1步,就是在3和6中选取最小值,选取3
选择2: 下标为3的d, 从a1的g顺时针旋转只需要3步,逆时针旋转需要4步。算上确认的1步,就是在4和5中选取最小值. 选取 4
如果g使用的是ring中第一个字符,针对以上2种选择,最好的选择就是使用下标为2的d,顺时针旋转2步,即3步。 那么,总的代价就是 1 + 3 = 4。
开头,我们就说过,ring中有开头和结尾都存在g,因此存在选择的问题。
b1. 如果我们使用ring中下标为6的g最为key的开头。顺时针旋转需要1步,逆时针旋转需要6步,算上最终确认的1步,就是2步和7步。选取最小值2.
b2. 接着b1继续分析,既然key的第一个字符已经确定了。那么key的第二个字符d又该选择 了。我们到底是用下标为2的d呢,还是使用下标为3的d呢?
选择1: 下标为2的d,从b1的g顺时针旋转只需要4步,逆时针旋转需要3步,。算上确认的1步,就是在5和4中选取最小值,选取4
选择2: 下标为3的d, 从b1的g顺时针旋转只需要3步,逆时针旋转需要4步。算上确认的1步,就是在4和5中选取最小值. 选取4
如果g使用的是ring中最后一个字符,针对以上2种选择,最好都为4。 那么,总的代价就是 2 + 4 = 6。
最终,如果以ring中第一个g作为旋转选择,最小的步数为4; 以ring中最后一个g作为旋转选择,那么最小步数为6; 因此,当前案例最小步数为 Math.min(4, 6).
递归代码