C语言程序查找给定字符串的排列
假设我们在一个数组中有一些字符串。我们必须找到它们在不同行中的所有排列。
因此,如果输入类似于 strings = ["abc", "def", "ghi"],则输出将为
abc def ghi abc ghi def def abc ghi def ghi abc ghi abc def ghi def abc
为了解决这个问题,我们将遵循以下步骤:
- 定义一个函数 next_permutation(),它将接收 n 和字符串数组 s 作为参数。
- 从 i := n - 1 开始,当 i > 0 时,更新(i 减 1),执行以下操作:
- 如果 s[i] > s[i - 1],则
- j := i + 1
- 从 j < n 开始,更新(j 加 1),执行以下操作:
- 如果 s[j] <= s[i - 1],则
- 退出循环
- t := s[i - 1]
- 如果 s[j] <= s[i - 1],则
- s[i - 1] = s[j - 1]
- s[j - 1] = t
- 从 i < n - 1 开始,更新(i 加 1),(n 减 1),执行以下操作:
- t := s[i]
- s[i] := s[n - 1]
- s[n - 1] = t
- 返回 1
- 如果 s[i] > s[i - 1],则
- 从 i := 0 开始,当 i < n - 1 时,更新(i 加 1),(n 减 1),执行以下操作:
- t := s[i]
- s[i] := s[n - 1]
- s[n - 1] = t
- 返回 0
- 从主方法执行以下操作
- 无限循环执行以下操作,直到 next_permutation(n, strings) 为 0:
- 从 i := 0 开始,当 i < n 时,更新(i 加 1),执行以下操作:
- 显示 strings[i],然后(如果 i 等于 n - 1,则换行,否则打印空格)
- 从 i := 0 开始,当 i < n 时,更新(i 加 1),执行以下操作:
示例
让我们看看以下实现以获得更好的理解:
#include <stdio.h> #include <string.h> int next_permutation(int n, char **s){ for (int i = n - 1; i > 0; i--) if (strcmp(s[i], s[i - 1]) > 0){ int j = i + 1; for (; j < n; j++) if (strcmp(s[j], s[i - 1]) <= 0) break; char *t = s[i - 1]; s[i - 1] = s[j - 1]; s[j - 1] = t; for (; i < n - 1; i++, n--){ t = s[i]; s[i] = s[n - 1]; s[n - 1] = t; } return 1; } for (int i = 0; i < n - 1; i++, n--){ char *t = s[i]; s[i] = s[n - 1]; s[n - 1] = t; } return 0; } int main(){ char *strings[] = {"abc", "def", "ghi"}; int n = 3; do{ for (int i = 0; i < n; i++) printf("%s%c", strings[i], i == n - 1 ? '
' : ' '); } while (next_permutation(n, strings)); }
输入
{"abc", "def", "ghi"}
输出
abc def ghi abc ghi def def abc ghi def ghi abc ghi abc def ghi def abc
广告