C 程序查找给定字符串的排列

cserver side programmingprogramming

假设数组中有几个字符串。我们必须在不同的行中找到它们的所有排列。

因此,如果输入类似于 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
    • return 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

相关文章