मान लीजिए कि हमारे पास एक सरणी में कुछ तार हैं। हमें उनके सभी क्रमपरिवर्तन अलग-अलग पंक्तियों में खोजने होंगे।
इसलिए, यदि इनपुट स्ट्रिंग्स =["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]
- अगर s[j] <=s[i - 1]), तो:
- अगर s[i]> s[i - 1]), तो:
- s[i - 1] =s[j - 1]
- s[j - 1] =t
- i
- टी:=एस[i]
- s[i] :=s[n - 1]
- s[n - 1] =t
- इनिशियलाइज़ i :=0 के लिए, जब i
- स्ट्रिंग प्रदर्शित करें[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