Skip to content

Commit a841068

Browse files
committed
add: 自由之路
1 parent e632bc4 commit a841068

File tree

6 files changed

+55
-1
lines changed

6 files changed

+55
-1
lines changed

.vscode/settings.json

+1
Original file line numberDiff line numberDiff line change
@@ -194,6 +194,7 @@
194194
"cxbc",
195195
"dbqca",
196196
"DCMAKE",
197+
"ddinggo",
197198
"dearmour",
198199
"deque",
199200
"dlimit",

README.md

+4
Original file line numberDiff line numberDiff line change
@@ -715,6 +715,10 @@ C++标准库提供的数据结构实在是太多了,参考[C++标准库头文
715715

716716
### 其它
717717

718+
- [自由之路](src/search/freedom_trail.cpp) [深度优先搜索, 广度优先搜索, 字符串, 动态规划]
719+
720+
- LeetCode 514. 自由之路 <https://leetcode.cn/problems/freedom-trail>
721+
718722
- [构造有效字符串的最少插入数](src/other/minimum_additions_to_make_valid_string.cpp) [Stack, Greedy, String, Dynamic Programming]
719723

720724
- LeetCode 2645. 构造有效字符串的最少插入数 <https://leetcode.cn/problems/minimum-additions-to-make-valid-string>

images/search/freedom_trail.jpeg

200 KB
Loading

src/search/freedom_trail.cpp

+27
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
// 自由之路
2+
// https://leetcode.cn/problems/freedom-trail
3+
// INLINE ../../images/search/freedom_trail.jpeg
4+
5+
#include <headers.hpp>
6+
7+
class Solution {
8+
public:
9+
int findRotateSteps(string ring, string key) {
10+
array<vector<int>, 26> idx_list;
11+
int n = ring.size(), m = key.size(), pc = ring.front() - 'a';
12+
for (int i = 0; i < n; ++i)
13+
idx_list[ring[i] - 'a'].push_back(i);
14+
vector<int> dp(n, 0x3f3f3f3f), pre(n, 0x3f3f3f3f);
15+
pre[0] = 0;
16+
for (int i = 0; i < m; ++i) {
17+
for (int idx : idx_list[key[i] - 'a'])
18+
for (int pi : idx_list[pc])
19+
dp[idx] =
20+
min(dp[idx], pre[pi] + min(abs(pi - idx), n - abs(pi - idx)));
21+
pre = std::move(dp);
22+
dp = vector(n, 0x3f3f3f3f);
23+
pc = key[i] - 'a';
24+
}
25+
return *min_element(pre.begin(), pre.end()) + key.size();
26+
}
27+
};

test/lib/lib_test.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// 执行编译时间:2024-01-23 10:16:33
1+
// 执行编译时间:2024-01-29 10:39:09
22
#include <gtest/gtest.h>
33
#include <lib.hpp>
44

test/search/freedom_trail_test.cpp

+22
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
#include <search/freedom_trail.cpp>
2+
3+
TEST(自由之路, findRotateSteps) {
4+
Solution solution;
5+
// 示例 1:
6+
// 输入: ring = "godding", key = "gd"
7+
// 输出: 4
8+
// 解释:
9+
// 对于 key 的第一个字符 'g',已经在正确的位置, 我们只需要1步来拼写这个字符。
10+
// 对于 key 的第二个字符 'd',我们需要逆时针旋转 ring "godding" 2步使它变成
11+
// "ddinggo"。 当然, 我们还需要1步进行拼写。 因此最终的输出是 4。
12+
string ring = "godding";
13+
string key = "gd";
14+
EXPECT_EQ(solution.findRotateSteps(ring, key), 4);
15+
16+
// 示例 2:
17+
// 输入: ring = "godding", key = "godding"
18+
// 输出: 13
19+
ring = "godding";
20+
key = "godding";
21+
EXPECT_EQ(solution.findRotateSteps(ring, key), 13);
22+
}

0 commit comments

Comments
 (0)