Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> การเขียนโปรแกรม C

โปรแกรม C หาการจัดเรียง (Permutations) ของสตริงที่กำหนด


คำอธิบายปัญหา

สมมติว่าเรามีสตริงหลายตัวในอาร์เรย์ เราต้องหาการจัดเรียง (Permutations) ทั้งหมดของสตริงเหล่านี้และแสดงผลแต่ละแบบในบรรทัดใหม่

ตัวอย่าง

หากอินพุตเป็น strings = ["abc", "def", "ghi"] ผลลัพธ์จะเป็น:

abc def ghi
abc ghi def
def abc ghi
def ghi abc
ghi abc def
ghi def abc

ขั้นตอนการแก้ปัญหา

  1. นิยามฟังก์ชัน next_permutation() ที่รับจำนวน n และอาร์เรย์สตริง s
  2. ใช้อัลกอริทึม Next Permutation มาตรฐาน:
    • หา index i ที่ s[i] > s[i-1] จากท้ายสุด
    • หา index j ที่ s[j] > s[i-1] จากท้ายสุด
    • สลับ s[i-1] กับ s[j-1]
    • กลับลำดับส่วนท้ายตั้งแต่ i ถึง n-1
  3. ใน main ใช้ do-while loop เรียก next_permutation() จนคืนค่า 0
  4. พิมพ์สตริงในแต่ละรอบคั่นด้วยช่องว่าง

โค้ดตัวอย่าง

#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 ? '\n' : ' ');
    } while (next_permutation(n, strings));
    return 0;
}

อินพุต

{"abc", "def", "ghi"}

เอาต์พุต

abc def ghi
abc ghi def
def abc ghi
def ghi abc
ghi abc def
ghi def abc