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
广告
数据结构
网络
关系数据库管理系统
操作系统
Java
iOS
HTML
CSS
Android
Python
C语言编程
C++
C#
MongoDB
MySQL
Javascript
PHP