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[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
  • 从 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,则换行,否则打印空格)

示例

让我们看看以下实现以获得更好的理解:

#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

更新于: 2021年10月8日

5K+ 次浏览

开启你的 职业生涯

通过完成课程获得认证

开始学习
广告