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