20240621 算法:递归回溯字符串输出
明昧 Lv7

题目

创建一个递归回溯算法,注意:字符串的排列组合,而不是字符的排列组合。

如果输入是 “123”,“456”,"789"输出的结果是 “123456789” “456123789” “456789123” "789123456 "等。

(a) 一个递归函数 “permutate_strings”,它将接收一个字符串数组作为输入,并生成所有可能的字符串排列组合

(b) 一个 "swap_strings "函数,它将被用于 “permutate_strings”,以帮助你生成所有可能的排列组合

代码实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#include <iostream>
#include <vector>
#include <string>


void swap_strings(std::vector<std::string>& strs, int i, int j) {
std::string temp = strs[i];
strs[i] = strs[j];
strs[j] = temp;
}


void permutate_strings(std::vector<std::string>& strs, int start, std::vector<std::string>& result)
{
//探索终点将当前站位拼接输出
if (start == strs.size() - 1)
{
std::string permutation;
for (const auto& str : strs)
{
permutation += str;
}
result.push_back(permutation);
return;
}

//进行排列组合
//基本思路:定初始一位,后面其他位同样定且交换
for (int i = start; i < strs.size(); ++i) {
swap_strings(strs, start, i);
permutate_strings(strs, start + 1, result);
swap_strings(strs, start, i);

//回溯过程中将交换还原到初始位置
//递归多少层就回溯多少层
}
}

int main() {
std::vector<std::string> input = {"123", "456", "789"};
std::vector<std::string> result;

permutate_strings(input, 0, result);

for (const auto& permutation : result) {
std::cout << permutation << std::endl;
}

return 0;
}

回溯总结

chatgpt

回溯算法的结构

回溯算法通常采用递归的形式实现。典型的回溯算法可以描述如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void backtrack(部分解) 
{
if (当前部分解是完整解) {
处理完整解;
return;
}

for (选择 : 当前可行的选项) {
if (选择满足约束条件) {
做选择;
backtrack(新的部分解);
撤销选择; // 回溯
}
}
}

回溯的应用场景

回溯算法常用于解决以下类型的问题:

  • 组合问题:例如子集生成、排列生成、组合生成。
  • 约束满足问题:例如数独、N皇后问题、图的着色问题。
  • 路径搜索问题:例如迷宫求解、骑士巡游问题。
 Comments
Comment plugin failed to load
Loading comment plugin
Powered by Hexo & Theme Keep
Unique Visitor Page View