class Solution {
public:
int findRotateSteps(string ring, string key) {
int lenring = ring.size();
int lenkey = key.size();
vector<vector<int>> dp(200, vector<int>(200, 1000000));
for (int i = 0; i < lenkey; i++)
for (int j = 0; j < lenring; j++)
if (key[i] == ring[j]) {
for (int k = 0; k < lenring; k++)
if (i)
dp[i][j] = min(dp[i][j], dp[i-1][k] + min(abs(k - j), lenring - abs(k - j)));
else
dp[i][j] = min(abs(i - j), lenring - abs(i - j));
}
int ans = 10000000;
for (int i = 0; i < lenring; i++)
ans = min(ans, dp[lenkey-1][i]);
return ans + lenkey;
}
};
dp[i][j] 表示key中第i个字条,ring中第j个字符时,所需的最小步数。
动态规划,比赛的时候写不出来,其实还算比较好想的,以后要加强。我这个代码也比较粗糙了。