ধরুন আমাদের একটি অ্যারেতে কয়েকটি স্ট্রিং আছে। আমাদের আলাদা আলাদা লাইনে তাদের সব পারমুটেশন খুঁজে বের করতে হবে।
সুতরাং, যদি ইনপুটটি স্ট্রিং এর মত হয় =["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 - যদি s[j] <=s[i - 1]), তারপর:
- লুপ থেকে বেরিয়ে আসুন
- t :=s[i - 1]
, আপডেট করুন (j 1 দ্বারা বাড়ান), করুন: - যদি s[i]> s[i - 1]), তারপর:
- s[i - 1] =s[j - 1]
- s[j - 1] =t
- i
- t :=s[i]
- s[i] :=s[n - 1]
- s[n - 1] =t
- না হওয়া পর্যন্ত
- নিম্নলিখিত অসীমভাবে করুন
- আরম্ভ করার জন্য i :=0, যখন 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 ? '\n' : ' '); } 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