एक स्ट्रिंग / पूर्णांक के सभी क्रमांकन सूचीबद्ध करना


159

प्रोग्रामिंग इंटरव्यू में एक सामान्य कार्य (साक्षात्कार के मेरे अनुभव से हालांकि नहीं) एक स्ट्रिंग या पूर्णांक लेना और हर संभव अनुमति की सूची बनाना है।

क्या इसका एक उदाहरण है कि यह कैसे किया जाता है और इस तरह की समस्या को हल करने के पीछे तर्क है?

मैंने कुछ कोड स्निपेट देखे हैं, लेकिन वे अच्छी तरह से टिप्पणी / व्याख्या नहीं की गई और इस प्रकार पालन करना कठिन है।


जवाबों:


152

सबसे पहले: यह निश्चित रूप से पुनरावृत्ति की तरह बदबू आ रही है !

चूंकि आप भी इस सिद्धांत को जानना चाहते थे, इसलिए मैंने इसे मानव भाषा में समझाने की पूरी कोशिश की। मुझे लगता है कि अधिकांश समय पुनरावृत्ति बहुत आसान है। आपको केवल दो चरणों को समझना होगा:

  1. पहला कदम
  2. अन्य सभी चरण (सभी एक ही तर्क के साथ)

में मानव भाषा :

संक्षेप में:
1. 1 तत्व का क्रमचय एक तत्व है।
2. तत्वों के एक समूह का क्रमपरिवर्तन तत्वों में से प्रत्येक की सूची है, जिसे अन्य तत्वों के प्रत्येक क्रमपरिवर्तन के साथ समाहित किया गया है।

उदाहरण:

यदि सेट में सिर्फ एक तत्व है ->
इसे वापस लौटाएं।
perm (a) -> a

यदि सेट में दो वर्ण हैं: इसमें प्रत्येक तत्व के लिए: तत्व को वापस लौटाएं, बाकी तत्वों को जोड़ने के क्रम में, जैसे:

perm (ab) ->

a + perm (b) -> ab

b + perm (a) -> बा

इसके अलावा: सेट में प्रत्येक चरित्र के लिए: एक चरित्र लौटें, एक सेट के साथ समेटना> बाकी सेट

perm (abc) ->

a + perm (bc) -> एबीसी , एसीबी

b + perm (एसी) -> बीएसी , बीकेए

c + perm (ab) -> कैब , cba

perm (abc ... z) ->

a + perm (...), b + perm (....)
...।

मुझे http://www.programmersheaven.com/mb/Algorithms/369713/369713/permutation-algorithm-help/ पर pseudocode मिला :

makePermutations(permutation) {
  if (length permutation < required length) {
    for (i = min digit to max digit) {
      if (i not in permutation) {
        makePermutations(permutation+i)
      }
    }
  }
  else {
    add permutation to list
  }
}

सी#

ठीक है, और कुछ और विस्तृत (और चूंकि यह c # टैग किया गया है), http://radio.weblogs.com/0111551/stories/2002/10/14/permutations.html से : लंबा, लेकिन मैंने इसे कॉपी करने का फैसला किया वैसे भी, इसलिए पोस्ट मूल पर निर्भर नहीं है।

फ़ंक्शन वर्णों की एक स्ट्रिंग लेता है, और उस सटीक स्ट्रिंग के हर संभव क्रमांकन को लिखता है, इसलिए, उदाहरण के लिए, यदि "एबीसी" की आपूर्ति की गई है, तो इसे बाहर फैलाना चाहिए:

एबीसी, एसीबी, बीएसी, बीसीए, सीएबी, सीबीए।

कोड:

class Program
{
    private static void Swap(ref char a, ref char b)
    {
        if (a == b) return;

        var temp = a;
        a = b;
        b = temp;
    }

    public static void GetPer(char[] list)
    {
        int x = list.Length - 1;
        GetPer(list, 0, x);
    }

    private static void GetPer(char[] list, int k, int m)
    {
        if (k == m)
        {
            Console.Write(list);
        }
        else
            for (int i = k; i <= m; i++)
            {
                   Swap(ref list[k], ref list[i]);
                   GetPer(list, k + 1, m);
                   Swap(ref list[k], ref list[i]);
            }
    }

    static void Main()
    {
        string str = "sagiv";
        char[] arr = str.ToCharArray();
        GetPer(arr);
    }
}

21
थोड़ी और स्पष्टता के लिए, मैं k "recursionDepth" कहूँगा और m "maxDepth" कहूँगा।
Nerf Herder

3
दूसरा स्वैप ( Swap(ref list[k], ref list[i]);) अनावश्यक है।
नृत्य 2

1
इस समाधान के लिए धन्यवाद। मैंने यह फिडेल ( dotnetfiddle.net/oTzihw ) इससे बनाया है (कश्मीर और एम के बजाय उचित नामकरण के साथ)। जहाँ तक मैं अहंकार को समझता हूँ, जब से आप मूल सरणी को जगह में संपादित करते हैं, तब से दूसरे स्वैप की आवश्यकता होती है।
एंड्रयू

3
एक मामूली बिंदु: ऐसा लगता है कि स्वैप विधि को एक अस्थायी बफर चर के साथ लागू किया जाना बेहतर है और XORs ( dotnetperls.com/swap ) का उपयोग नहीं करना है
Sergioet

7
C # 7 टुपल्स का उपयोग करके आप स्वैप को बहुत अधिक सुरुचिपूर्ण बना सकते हैं:(a[x], a[y]) = (a[y], a[x]);
डेरेन

81

यदि LINQ का उपयोग करने की अनुमति है तो यह कोड की सिर्फ दो लाइनें हैं। कृपया मेरा उत्तर यहाँ देखें ।

संपादित करें

यहाँ मेरा जेनेरिक फ़ंक्शन है जो T की सूची से सभी क्रमपरिवर्तन (संयोजन नहीं) लौटा सकता है:

static IEnumerable<IEnumerable<T>>
    GetPermutations<T>(IEnumerable<T> list, int length)
{
    if (length == 1) return list.Select(t => new T[] { t });

    return GetPermutations(list, length - 1)
        .SelectMany(t => list.Where(e => !t.Contains(e)),
            (t1, t2) => t1.Concat(new T[] { t2 }));
}

उदाहरण:

IEnumerable<IEnumerable<int>> result =
    GetPermutations(Enumerable.Range(1, 3), 3);

आउटपुट - पूर्णांक सूची की सूची:

{1,2,3} {1,3,2} {2,1,3} {2,3,1} {3,1,2} {3,2,1}

चूंकि यह फ़ंक्शन LINQ का उपयोग करता है, इसलिए इसे .net 3.5 या उच्चतर की आवश्यकता होती है।


3
संयोजन और क्रमपरिवर्तन अलग-अलग चीजें हैं। यह समान है, लेकिन तत्वों के एक सेट के सभी क्रमपरिवर्तन की तुलना में आपका जवाब एक अलग समस्या का जवाब देता है।
शॉन कोवाक

@ ShhawnKovac, यह इंगित करने के लिए धन्यवाद! मैंने अपने कोड को संयोजन से क्रमचय पर अद्यतन किया है।
पेंगयांग

1
@ पेंगयांग मैंने आपके अन्य उत्तर को देखा और मैं कहूंगा कि इससे मुझे बहुत फायदा हुआ लेकिन मेरी एक और स्थिति है कि मुझे नहीं पता कि आपने इसे हल करने का सही तरीका बताया। मैं 'HALLOWEEN' जैसे शब्द के सभी क्रमपरिवर्तन ढूंढना चाहता था, लेकिन मैंने पाया कि मैं परिणाम में 'L' और 'E' दोनों को शामिल करना चाहता हूं। मेरे पुनरावृत्तियों में मैंने प्रत्येक पुनरावृत्ति (लंबाई ++) के साथ लंबाई बढ़ाने की आपकी विधि पर लूप किया और उम्मीद करेगा कि HALLOWEEN (9 वर्ण) शब्द की पूरी लंबाई को देखते हुए मुझे परिणाम 9 वर्णों के लंबे मिलेंगे ... लेकिन ऐसा नहीं है मुझे केवल 7 (1 एल और 1 ई छूट गए हैं)
मेगामार्क

मैं यह भी बताना चाहूंगा कि मैं ऐसी स्थिति नहीं चाहता जहां मुझे 9 'एच' के 'एच' शब्द के रूप में केवल एक बार दिखाई दे।
मेगामार्क

4
@MegaMark इस फ़ंक्शन के लिए तत्वों का अद्वितीय होना आवश्यक है। इसे आजमाएँ:const string s = "HALLOWEEN"; var result = GetPermutations(Enumerable.Range(0, s.Length), s.Length).Select(t => t.Select(i => s[i]));
पेंगयांग

36

यहां मैंने इसका हल ढूंढ लिया है। यह जावा में लिखा गया था, लेकिन मैंने इसे C # में बदल दिया है। मुझे आशा है कि यह आपकी मदद करेगा।

यहां छवि विवरण दर्ज करें

यहाँ C # में कोड है:

static void Main(string[] args)
{
    string str = "ABC";
    char[] charArry = str.ToCharArray();
    Permute(charArry, 0, 2);
    Console.ReadKey();
}

static void Permute(char[] arry, int i, int n)
{
    int j;
    if (i==n)
        Console.WriteLine(arry);
    else
    {
        for(j = i; j <=n; j++)
        {
            Swap(ref arry[i],ref arry[j]);
            Permute(arry,i+1,n);
            Swap(ref arry[i], ref arry[j]); //backtrack
        }
    }
}

static void Swap(ref char a, ref char b)
{
    char tmp;
    tmp = a;
    a=b;
    b = tmp;
}

क्या यह दूसरी भाषा से लिया गया है? निश्चित रूप से छवि के लिए +1, क्योंकि यह वास्तव में मूल्य जोड़ता है। हालाँकि, कोड में एक निश्चित सुधार की संभावना है। कुछ मामूली हिस्सों की ज़रूरत नहीं है, लेकिन सबसे महत्वपूर्ण बात यह है कि मुझे यह C ++ का अहसास हो रहा है जब हम किसी चीज़ में भेजते हैं और इसमें दिए गए मापदंडों को प्रदान करने और लौटाए गए मूल्य को प्राप्त करने के बजाय इसे करते हैं। वास्तव में, मैंने एक C # -स्टील्ड C # कोड लागू करने के लिए आपकी छवि का उपयोग किया (शैली निश्चित रूप से मेरी व्यक्तिगत धारणा है), और इसने मुझे बहुत सहायता प्रदान की, इसलिए जब मैं इसे पोस्ट करूँगा तो निश्चित रूप से आपसे (और क्रेडिट) चुरा लूंगा आप इसके लिए)।
कोनराड विल्टरनस्ट

21

पुनरावृत्ति आवश्यक नहीं है, यहां इस समाधान के बारे में अच्छी जानकारी है।

var values1 = new[] { 1, 2, 3, 4, 5 };

foreach (var permutation in values1.GetPermutations())
{
    Console.WriteLine(string.Join(", ", permutation));
}

var values2 = new[] { 'a', 'b', 'c', 'd', 'e' };

foreach (var permutation in values2.GetPermutations())
{
    Console.WriteLine(string.Join(", ", permutation));
}

Console.ReadLine();

मुझे इस एल्गोरिथ्म का उपयोग वर्षों से किया गया है, इसमें प्रत्येक क्रमपरिवर्तन की गणना करने के लिए O (N) समय और स्थान जटिलता है ।

public static class SomeExtensions
{
    public static IEnumerable<IEnumerable<T>> GetPermutations<T>(this IEnumerable<T> enumerable)
    {
        var array = enumerable as T[] ?? enumerable.ToArray();

        var factorials = Enumerable.Range(0, array.Length + 1)
            .Select(Factorial)
            .ToArray();

        for (var i = 0L; i < factorials[array.Length]; i++)
        {
            var sequence = GenerateSequence(i, array.Length - 1, factorials);

            yield return GeneratePermutation(array, sequence);
        }
    }

    private static IEnumerable<T> GeneratePermutation<T>(T[] array, IReadOnlyList<int> sequence)
    {
        var clone = (T[]) array.Clone();

        for (int i = 0; i < clone.Length - 1; i++)
        {
            Swap(ref clone[i], ref clone[i + sequence[i]]);
        }

        return clone;
    }

    private static int[] GenerateSequence(long number, int size, IReadOnlyList<long> factorials)
    {
        var sequence = new int[size];

        for (var j = 0; j < sequence.Length; j++)
        {
            var facto = factorials[sequence.Length - j];

            sequence[j] = (int)(number / facto);
            number = (int)(number % facto);
        }

        return sequence;
    }

    static void Swap<T>(ref T a, ref T b)
    {
        T temp = a;
        a = b;
        b = temp;
    }

    private static long Factorial(int n)
    {
        long result = n;

        for (int i = 1; i < n; i++)
        {
            result = result * i;
        }

        return result;
    }
}

बॉक्स से बाहर काम करता है!
घूमना

1
शायद मैं O (n) संकेतन को नहीं समझता। क्या एन का उल्लेख नहीं है कि आपके एल्गोरिथ्म को काम करने के लिए कितने "इनर लूप" आवश्यक हैं? मुझे ऐसा लगता है जैसे यदि आपके पास N नंबर हैं, तो ऐसा लगता है कि यह O (N * N!) है (क्योंकि N! बार इसे N स्वैप करना है)। इसके अलावा, यह एक टन की नकल करना है। यह कोड "नीट" है, लेकिन मैं इसका उपयोग नहीं करूंगा।
एरिक फ्रेज़र

@ericfrazer प्रत्येक क्रमपरिवर्तन केवल एक सरणी प्रतिलिपि का उपयोग करता है, और O(N-1)अनुक्रम के O(N)लिए और स्वैप के लिए, जो है O(N)। और मैं अभी भी उत्पादन में इसका उपयोग कर रहा हूं, लेकिन रिफ्लेक्टर के साथ केवल एक क्रमचय उत्पन्न करने के लिए: GetPermutation(i)जहां 0 <= i <= N!-1। मुझे इससे बेहतर प्रदर्शन के साथ कुछ का उपयोग करने में खुशी होगी, इसलिए कुछ बेहतर के लिए एक संदर्भ को कॉल करने के लिए स्वतंत्र रहें, अधिकांश विकल्प O(N!)स्मृति में उपयोग करते हैं , इसलिए आप इसे भी देख सकते हैं।
नजरे

11
void permute (char *str, int ptr) {
  int i, len;
  len = strlen(str);
  if (ptr == len) {
    printf ("%s\n", str);
    return;
  }

  for (i = ptr ; i < len ; i++) {
    swap (&str[ptr], &str[i]);
    permute (str, ptr + 1);
    swap (&str[ptr], &str[i]);
  }
}

आप वर्णों को स्वैप करने के लिए अपना स्वैप फ़ंक्शन लिख सकते हैं।
इसे परमिट (स्ट्रिंग, 0) के रूप में बुलाया जाना है;


5
यह C जैसा दिखता है, C # नहीं।
जॉन श्नाइडर

9

सबसे पहले, सेट में क्रमपरिवर्तन होते हैं, तार या पूर्णांक नहीं होते हैं, इसलिए मैं आपको केवल "एक स्ट्रिंग में वर्णों का सेट" मतलब मानूंगा।

ध्यान दें कि आकार n का एक सेट n है! एन-क्रमपरिवर्तन।

निम्नलिखित pseudocode (विकिपीडिया से), k = 1 ... n के साथ कहा जाता है! सभी क्रमपरिवर्तन देंगे:

function permutation(k, s) {
    for j = 2 to length(s) {
        swap s[(k mod j) + 1] with s[j]; // note that our array is indexed starting at 1
        k := k / j; // integer division cuts off the remainder
    }
    return s;
}

यहाँ समान पायथन कोड है (0-आधारित सरणी अनुक्रमित के लिए):

def permutation(k, s):
    r = s[:]
    for j in range(2, len(s)+1):
        r[j-1], r[k%j] = r[k%j], r[j-1]
        k = k/j+1
    return r

5
यह कौनसी भाषा है? प्रश्न सी # के रूप में चिह्नित है। मैं नहीं जानता कि क्या k := k / j;करता है।
शॉन कोवाक

8

सी # में थोड़ा संशोधित संस्करण है कि पैदावार किसी भी प्रकार की एक सरणी में क्रमपरिवर्तन की आवश्यकता है।

    // USAGE: create an array of any type, and call Permutations()
    var vals = new[] {"a", "bb", "ccc"};
    foreach (var v in Permutations(vals))
        Console.WriteLine(string.Join(",", v)); // Print values separated by comma


public static IEnumerable<T[]> Permutations<T>(T[] values, int fromInd = 0)
{
    if (fromInd + 1 == values.Length)
        yield return values;
    else
    {
        foreach (var v in Permutations(values, fromInd + 1))
            yield return v;

        for (var i = fromInd + 1; i < values.Length; i++)
        {
            SwapValues(values, fromInd, i);
            foreach (var v in Permutations(values, fromInd + 1))
                yield return v;
            SwapValues(values, fromInd, i);
        }
    }
}

private static void SwapValues<T>(T[] values, int pos1, int pos2)
{
    if (pos1 != pos2)
    {
        T tmp = values[pos1];
        values[pos1] = values[pos2];
        values[pos2] = tmp;
    }
}

इस कार्यान्वयन के साथ एक मामूली चेतावनी: यह केवल ठीक से काम करता है यदि आप गणना मूल्य को संग्रहीत करने का प्रयास नहीं करते हैं। यदि आप कुछ करने की कोशिश करते हैं, Permutations(vals).ToArray()तो आप उसी सरणी के लिए एन संदर्भों के साथ समाप्त होते हैं। यदि आप उन परिणामों को संग्रहीत करने में सक्षम होना चाहते हैं जिन्हें आपको मैन्युअल रूप से प्रतिलिपि बनाना है। जैसेPermutations(values).Select(v => (T[])v.Clone())

8
class Program
{
    public static void Main(string[] args)
    {
        Permutation("abc");
    }

    static void Permutation(string rest, string prefix = "")
    {
        if (string.IsNullOrEmpty(rest)) Console.WriteLine(prefix);

        // Each letter has a chance to be permutated
        for (int i = 0; i < rest.Length; i++)
        {                
            Permutation(rest.Remove(i, 1), prefix + rest[i]);
        }
    }
}

1
पागल समाधान। धन्यवाद!
क्रिस्टियन ई।

7

मुझे FBryant87 दृष्टिकोण पसंद आया क्योंकि यह सरल है। दुर्भाग्य से, यह कई अन्य "समाधानों" को पसंद करता है जो सभी क्रमपरिवर्तन या उदाहरण के लिए पूर्णांक प्रदान नहीं करता है यदि इसमें एक ही अंक एक से अधिक बार हो। उदाहरण के तौर पर 656123 को लें। रेखा:

var tail = chars.Except(new List<char>(){c});

सिवाय का उपयोग कर सभी घटनाओं का कारण होगा हटा दिया जाना चाहिए, यानी जब ग = 6, दो अंक निकाल दिए जाते हैं और हम 5123. जैसे समाधान मैं इस हल की कोशिश की में से कोई भी के बाद से साथ छोड़ दिया जाता है, मैं अपने आप को द्वारा कोशिश करते हैं और इसे हल करने का निर्णय लिया FBryant87 की आधार के रूप में कोड। मैंने ये ढूंढ निकाला:

private static List<string> FindPermutations(string set)
    {
        var output = new List<string>();
        if (set.Length == 1)
        {
            output.Add(set);
        }
        else
        {
            foreach (var c in set)
            {
                // Remove one occurrence of the char (not all)
                var tail = set.Remove(set.IndexOf(c), 1);
                foreach (var tailPerms in FindPermutations(tail))
                {
                    output.Add(c + tailPerms);
                }
            }
        }
        return output;
    }

मैं बस .Rove और .IndexOf का उपयोग करके पहली पाया घटना को हटाता हूं। कम से कम मेरे उपयोग के उद्देश्य से काम करने लगता है। मुझे यकीन है कि इसे चतुर बनाया जा सकता है।

हालांकि ध्यान देने वाली एक बात: परिणामी सूची में डुप्लिकेट शामिल हो सकते हैं, इसलिए सुनिश्चित करें कि आप या तो विधि को वापस करना चाहते हैं उदाहरण के लिए एक हैशसेट बदले या किसी भी विधि का उपयोग करके वापसी के बाद डुप्लिकेट को हटा दें।


एक परम सौंदर्य की तरह काम करता है, पहले मैंने पाया है कि नकली पात्रों को संभालता है +1
जैक केसी

5

यहाँ सभी क्रमपरिवर्तन खोजने के लिए तीन एल्गोरिदम को कवर करने के लिए एक अच्छा लेख है, जिसमें से एक अगले क्रमपरिवर्तन को खोजने के लिए है।

http://www.cut-the-knot.org/do_you_know/AllPerm.shtml

C ++ और पायथन में क्रमशः नेक्स्ट_परमुटेशन और इटर्टोलेस्पेरमुटेशन फ़ंक्शंस हैं।


5

यहाँ विशुद्ध रूप से कार्यात्मक F # कार्यान्वयन है:


let factorial i =
    let rec fact n x =
        match n with
        | 0 -> 1
        | 1 -> x
        | _ -> fact (n-1) (x*n)
    fact i 1

let swap (arr:'a array) i j = [| for k in 0..(arr.Length-1) -> if k = i then arr.[j] elif k = j then arr.[i] else arr.[k] |]

let rec permutation (k:int,j:int) (r:'a array) =
    if j = (r.Length + 1) then r
    else permutation (k/j+1, j+1) (swap r (j-1) (k%j))

let permutations (source:'a array) = seq { for k = 0 to (source |> Array.length |> factorial) - 1 do yield permutation (k,2) source }

सीएलआर सरणियों की परस्पर प्रकृति का लाभ उठाने के लिए स्वैप को बदलकर प्रदर्शन में बहुत सुधार किया जा सकता है, लेकिन यह कार्यान्वयन स्रोत सरणी के संबंध में थ्रेड सुरक्षित है और कुछ संदर्भों में वांछनीय हो सकता है। इसके अलावा, 16 से अधिक तत्वों के साथ सरणियों के लिए int से अधिक / मनमानी परिशुद्धता के साथ प्रकारों के साथ प्रतिस्थापित किया जाना चाहिए, क्योंकि एक int32 प्रवाह में तथ्यात्मक 17 परिणाम।


5

यहाँ पुनरावृत्ति का उपयोग करके c # में एक सरल समाधान है,

void Main()
{
    string word = "abc";
    WordPermuatation("",word);
}

void WordPermuatation(string prefix, string word)
{
    int n = word.Length;
    if (n == 0) { Console.WriteLine(prefix); }
    else
    {
        for (int i = 0; i < n; i++)
        {
            WordPermuatation(prefix + word[i],word.Substring(0, i) + word.Substring(i + 1, n - (i+1)));
        }
    }
}

बहुत ही सरल और संक्षिप्त समाधान के लिए धन्यवाद! :)
क्रिस्टप्स विलेर्ट्स

4

इनपुट के रूप में स्ट्रिंग और पूर्णांक दोनों के लिए पर्मुटियन फ़ंक्शन को समझना आसान है। इसके साथ आप अपनी आउटपुट लंबाई भी निर्धारित कर सकते हैं (जो सामान्य स्थिति में इनपुट लंबाई के बराबर है)

तार

    static ICollection<string> result;

    public static ICollection<string> GetAllPermutations(string str, int outputLength)
    {
        result = new List<string>();
        MakePermutations(str.ToCharArray(), string.Empty, outputLength);
        return result;
    }

    private static void MakePermutations(
       char[] possibleArray,//all chars extracted from input
       string permutation,
       int outputLength//the length of output)
    {
         if (permutation.Length < outputLength)
         {
             for (int i = 0; i < possibleArray.Length; i++)
             {
                 var tempList = possibleArray.ToList<char>();
                 tempList.RemoveAt(i);
                 MakePermutations(tempList.ToArray(), 
                      string.Concat(permutation, possibleArray[i]), outputLength);
             }
         }
         else if (!result.Contains(permutation))
            result.Add(permutation);
    }

और पूर्णांक के लिए बस कॉलर विधि और MakePermutations () अछूता रहता है:

    public static ICollection<int> GetAllPermutations(int input, int outputLength)
    {
        result = new List<string>();
        MakePermutations(input.ToString().ToCharArray(), string.Empty, outputLength);
        return result.Select(m => int.Parse(m)).ToList<int>();
    }

उदाहरण 1: GetAllPermutations ("एबीसी", 3); "एबीसी" "एसीबी" "बेक" "बीका" "कैब" "सीबीए"

उदाहरण 2: GetAllPermutations ("abcd", 2); "ab" "ac" "ad" "ba" "bc" "bd" "ca" "cb" "cd" "da" "db" "dc"

उदाहरण 3: GetAllPermutations (486,2); 48 46 84 86 64 68


मुझे आपका समाधान पसंद है क्योंकि यह समझना आसान है, इसके लिए धन्यवाद! फिर भी मैंने उस एक के साथ जाना चुना: stackoverflow.com/questions/756055/… । इसका कारण यह है कि ToList, ToArray और RemoveAt सभी में O (N) की समय जटिलता है। तो मूल रूप से आपको संग्रह के सभी तत्वों पर जाना होगा (देखें stackoverflow.com/a/15042066/1132522 )। उसी इंट के लिए जहां आप मूल रूप से सभी तत्वों को फिर से अंत में जाने के लिए उन्हें इंट में बदलने के लिए। मैं मानता हूँ कि यह "एबीसी" या 486 के लिए बहुत प्रभाव नहीं है।
एंड्रयू

2

यहां फ़ंक्शन है जो सभी क्रमिकता को प्रिंट करेगा। यह कार्य याचिकाकर्ता द्वारा समझाए गए तर्क को लागू करता है।

public class Permutation
{
    //http://www.java2s.com/Tutorial/Java/0100__Class-Definition/RecursivemethodtofindallpermutationsofaString.htm

    public static void permuteString(String beginningString, String endingString)
    {           

        if (endingString.Length <= 1)
            Console.WriteLine(beginningString + endingString);
        else
            for (int i = 0; i < endingString.Length; i++)
            {

                String newString = endingString.Substring(0, i) + endingString.Substring(i + 1);

                permuteString(beginningString + endingString.ElementAt(i), newString);

            }
    }
}

    static void Main(string[] args)
    {

        Permutation.permuteString(String.Empty, "abc");
        Console.ReadLine();

    }

2

नीचे मेरे क्रमपरिवर्तन का कार्यान्वयन है। चर नामों का बुरा न मानें, क्योंकि मैं इसे मज़े के लिए कर रहा था :)

class combinations
{
    static void Main()
    {

        string choice = "y";
        do
        {
            try
            {
                Console.WriteLine("Enter word :");
                string abc = Console.ReadLine().ToString();
                Console.WriteLine("Combinatins for word :");
                List<string> final = comb(abc);
                int count = 1;
                foreach (string s in final)
                {
                    Console.WriteLine("{0} --> {1}", count++, s);
                }
                Console.WriteLine("Do you wish to continue(y/n)?");
                choice = Console.ReadLine().ToString();
            }
            catch (Exception exc)
            {
                Console.WriteLine(exc);
            }
        } while (choice == "y" || choice == "Y");
    }

    static string swap(string test)
    {
        return swap(0, 1, test);
    }

    static List<string> comb(string test)
    {
        List<string> sec = new List<string>();
        List<string> first = new List<string>();
        if (test.Length == 1) first.Add(test);
        else if (test.Length == 2) { first.Add(test); first.Add(swap(test)); }
        else if (test.Length > 2)
        {
            sec = generateWords(test);
            foreach (string s in sec)
            {
                string init = s.Substring(0, 1);
                string restOfbody = s.Substring(1, s.Length - 1);

                List<string> third = comb(restOfbody);
                foreach (string s1 in third)
                {
                    if (!first.Contains(init + s1)) first.Add(init + s1);
                }


            }
        }

        return first;
    }

    static string ShiftBack(string abc)
    {
        char[] arr = abc.ToCharArray();
        char temp = arr[0];
        string wrd = string.Empty;
        for (int i = 1; i < arr.Length; i++)
        {
            wrd += arr[i];
        }

        wrd += temp;
        return wrd;
    }

    static List<string> generateWords(string test)
    {
        List<string> final = new List<string>();
        if (test.Length == 1)
            final.Add(test);
        else
        {
            final.Add(test);
            string holdString = test;
            while (final.Count < test.Length)
            {
                holdString = ShiftBack(holdString);
                final.Add(holdString);
            }
        }

        return final;
    }

    static string swap(int currentPosition, int targetPosition, string temp)
    {
        char[] arr = temp.ToCharArray();
        char t = arr[currentPosition];
        arr[currentPosition] = arr[targetPosition];
        arr[targetPosition] = t;
        string word = string.Empty;
        for (int i = 0; i < arr.Length; i++)
        {
            word += arr[i];

        }

        return word;

    }
}

2

यहाँ एक उच्च स्तरीय उदाहरण मैंने लिखा है जो पीटर द्वारा दी गई मानव भाषा की व्याख्या को दर्शाता है :

    public List<string> FindPermutations(string input)
    {
        if (input.Length == 1)
            return new List<string> { input };
        var perms = new List<string>();
        foreach (var c in input)
        {
            var others = input.Remove(input.IndexOf(c), 1);
            perms.AddRange(FindPermutations(others).Select(perm => c + perm));
        }
        return perms;
    }

यह समाधान वास्तव में दोषपूर्ण है कि अगर स्ट्रिंग सेट में कोई भी दोहरा वर्ण है, तो यह विफल हो जाएगा। उदाहरण के लिए, 'परीक्षण' शब्द पर, अतिरिक्त कमांड केवल आवश्यक होने पर पहले और अंतिम के बजाय 'टी' के दोनों उदाहरणों को हटा देगा।
मिदास

1
@ मिदास अच्छी तरह से देखा जाता है, सौभाग्य से गले लगाने के लिए एक समाधान के साथ आया है।
FBryant87

1

यदि प्रदर्शन और स्मृति एक मुद्दा है, तो मैं इसे बहुत ही कुशल कार्यान्वयन का सुझाव देता हूं। विकिपीडिया में हीप के एल्गोरिथ्म के अनुसार , यह सबसे तेज़ होना चाहिए। आशा है कि यह आपकी आवश्यकता फिट होगा :-)!

बस 10 के लिए एक लाइनक कार्यान्वयन के साथ इसकी तुलना के रूप में! (कोड शामिल):

  • यह: 235 मिलीसेकंड में 36288000 आइटम
  • Linq: 50051 मिलीसेकंड में 36288000 आइटम

    using System;
    using System.Collections.Generic;
    using System.Diagnostics;
    using System.Linq;
    using System.Runtime.CompilerServices;
    using System.Text;
    
    namespace WpfPermutations
    {
        /// <summary>
        /// EO: 2016-04-14
        /// Generator of all permutations of an array of anything.
        /// Base on Heap's Algorithm. See: https://en.wikipedia.org/wiki/Heap%27s_algorithm#cite_note-3
        /// </summary>
        public static class Permutations
        {
            /// <summary>
            /// Heap's algorithm to find all pmermutations. Non recursive, more efficient.
            /// </summary>
            /// <param name="items">Items to permute in each possible ways</param>
            /// <param name="funcExecuteAndTellIfShouldStop"></param>
            /// <returns>Return true if cancelled</returns> 
            public static bool ForAllPermutation<T>(T[] items, Func<T[], bool> funcExecuteAndTellIfShouldStop)
            {
                int countOfItem = items.Length;
    
                if (countOfItem <= 1)
                {
                    return funcExecuteAndTellIfShouldStop(items);
                }
    
                var indexes = new int[countOfItem];
                for (int i = 0; i < countOfItem; i++)
                {
                    indexes[i] = 0;
                }
    
                if (funcExecuteAndTellIfShouldStop(items))
                {
                    return true;
                }
    
                for (int i = 1; i < countOfItem;)
                {
                    if (indexes[i] < i)
                    { // On the web there is an implementation with a multiplication which should be less efficient.
                        if ((i & 1) == 1) // if (i % 2 == 1)  ... more efficient ??? At least the same.
                        {
                            Swap(ref items[i], ref items[indexes[i]]);
                        }
                        else
                        {
                            Swap(ref items[i], ref items[0]);
                        }
    
                        if (funcExecuteAndTellIfShouldStop(items))
                        {
                            return true;
                        }
    
                        indexes[i]++;
                        i = 1;
                    }
                    else
                    {
                        indexes[i++] = 0;
                    }
                }
    
                return false;
            }
    
            /// <summary>
            /// This function is to show a linq way but is far less efficient
            /// </summary>
            /// <typeparam name="T"></typeparam>
            /// <param name="list"></param>
            /// <param name="length"></param>
            /// <returns></returns>
            static IEnumerable<IEnumerable<T>> GetPermutations<T>(IEnumerable<T> list, int length)
            {
                if (length == 1) return list.Select(t => new T[] { t });
    
                return GetPermutations(list, length - 1)
                    .SelectMany(t => list.Where(e => !t.Contains(e)),
                        (t1, t2) => t1.Concat(new T[] { t2 }));
            }
    
            /// <summary>
            /// Swap 2 elements of same type
            /// </summary>
            /// <typeparam name="T"></typeparam>
            /// <param name="a"></param>
            /// <param name="b"></param>
            [MethodImpl(MethodImplOptions.AggressiveInlining)]
            static void Swap<T>(ref T a, ref T b)
            {
                T temp = a;
                a = b;
                b = temp;
            }
    
            /// <summary>
            /// Func to show how to call. It does a little test for an array of 4 items.
            /// </summary>
            public static void Test()
            {
                ForAllPermutation("123".ToCharArray(), (vals) =>
                {
                    Debug.Print(String.Join("", vals));
                    return false;
                });
    
                int[] values = new int[] { 0, 1, 2, 4 };
    
                Debug.Print("Non Linq");
                ForAllPermutation(values, (vals) =>
                {
                    Debug.Print(String.Join("", vals));
                    return false;
                });
    
                Debug.Print("Linq");
                foreach(var v in GetPermutations(values, values.Length))
                {
                    Debug.Print(String.Join("", v));
                }
    
                // Performance
                int count = 0;
    
                values = new int[10];
                for(int n = 0; n < values.Length; n++)
                {
                    values[n] = n;
                }
    
                Stopwatch stopWatch = new Stopwatch();
                stopWatch.Reset();
                stopWatch.Start();
    
                ForAllPermutation(values, (vals) =>
                {
                    foreach(var v in vals)
                    {
                        count++;
                    }
                    return false;
                });
    
                stopWatch.Stop();
                Debug.Print($"Non Linq {count} items in {stopWatch.ElapsedMilliseconds} millisecs");
    
                count = 0;
                stopWatch.Reset();
                stopWatch.Start();
    
                foreach (var vals in GetPermutations(values, values.Length))
                {
                    foreach (var v in vals)
                    {
                        count++;
                    }
                }
    
                stopWatch.Stop();
                Debug.Print($"Linq {count} items in {stopWatch.ElapsedMilliseconds} millisecs");
    
            }
        }
    }

1

यहाँ जावास्क्रिप्ट (NodeJS) में मेरा समाधान है। मुख्य विचार यह है कि हम एक समय में एक तत्व लेते हैं, स्ट्रिंग से "इसे हटा दें", बाकी पात्रों को अलग-अलग करें, और सामने की तरफ तत्व डालें।

function perms (string) {
  if (string.length == 0) {
    return [];
  }
  if (string.length == 1) {
    return [string];
  }
  var list = [];
  for(var i = 0; i < string.length; i++) {
    var invariant = string[i];
    var rest = string.substr(0, i) + string.substr(i + 1);
    var newPerms = perms(rest);
    for (var j = 0; j < newPerms.length; j++) {
      list.push(invariant + newPerms[j]);
    }
  }
  return list;
}

module.exports = perms;

और यहाँ परीक्षण हैं:

require('should');
var permutations = require('../src/perms');

describe('permutations', function () {
  it('should permute ""', function () {
    permutations('').should.eql([]);
  })

  it('should permute "1"', function () {
    permutations('1').should.eql(['1']);
  })

  it('should permute "12"', function () {
    permutations('12').should.eql(['12', '21']);
  })

  it('should permute "123"', function () {
    var expected = ['123', '132', '321', '213', '231', '312'];
    var actual = permutations('123');
    expected.forEach(function (e) {
      actual.should.containEql(e);
    })
  })

  it('should permute "1234"', function () {
    // Wolfram Alpha FTW!
    var expected = ['1234', '1243', '1324', '1342', '1423', '1432', '2134', '2143', '2314', '2341', '2413', '2431', '3124', '3142', '3214', '3241', '3412', '3421', '4123', '4132'];
    var actual = permutations('1234');
    expected.forEach(function (e) {
      actual.should.containEql(e);
    })
  })
})

1

यहाँ सबसे सरल उपाय है जिसके बारे में मैं सोच सकता हूँ:

let rec distribute e = function
  | [] -> [[e]]
  | x::xs' as xs -> (e::xs)::[for xs in distribute e xs' -> x::xs]

let permute xs = Seq.fold (fun ps x -> List.collect (distribute x) ps) [[]] xs

distributeसमारोह एक नए तत्व लेता है eऔर एक nतत्व सूची और की सूची लौटाता n+1सूचियों जिनमें से प्रत्येक है eएक अलग जगह पर डाला। उदाहरण के लिए, 10सूची में चार संभावित स्थानों में से प्रत्येक में सम्मिलित करना [1;2;3]:

> distribute 10 [1..3];;
val it : int list list =
  [[10; 1; 2; 3]; [1; 10; 2; 3]; [1; 2; 10; 3]; [1; 2; 3; 10]]

यह permuteफ़ंक्शन प्रत्येक तत्व के बदले में अब तक जमा हुए क्रमपरिवर्तन पर वितरण करता है, सभी क्रमपरिवर्तन में परिणत होता है। उदाहरण के लिए, सूची के 6 क्रमांकन [1;2;3]:

> permute [1;2;3];;
val it : int list list =
  [[3; 2; 1]; [2; 3; 1]; [2; 1; 3]; [3; 1; 2]; [1; 3; 2]; [1; 2; 3]]

मध्यवर्ती संचयकर्ताओं को रखने के foldलिए एक scanक्रम में बदलने से कुछ प्रकाश कैसे एक समय में एक तत्व उत्पन्न होता है, इस पर प्रकाश डालते हैं:

> Seq.scan (fun ps x -> List.collect (distribute x) ps) [[]] [1..3];;
val it : seq<int list list> =
  seq
    [[[]]; [[1]]; [[2; 1]; [1; 2]];
     [[3; 2; 1]; [2; 3; 1]; [2; 1; 3]; [3; 1; 2]; [1; 3; 2]; [1; 2; 3]]]

1

एक स्ट्रिंग के क्रमपरिवर्तन सूची। वर्ण दोहराए जाने पर दोहराव से बचा जाता है:

using System;
using System.Collections;

class Permutation{
  static IEnumerable Permutations(string word){
    if (word == null || word.Length <= 1) {
      yield return word;
      yield break;
    }

    char firstChar = word[0];
    foreach( string subPermute in Permutations (word.Substring (1)) ) {
      int indexOfFirstChar = subPermute.IndexOf (firstChar);
      if (indexOfFirstChar == -1) indexOfFirstChar = subPermute.Length;

      for( int index = 0; index <= indexOfFirstChar; index++ )
        yield return subPermute.Insert (index, new string (firstChar, 1));
    }
  }

  static void Main(){
    foreach( var permutation in Permutations ("aab") )
      Console.WriteLine (permutation);
  }
}

2
पहले से मौजूद इतने सारे काम कर रहे समाधानों के साथ, आप यह वर्णन करना चाहते हैं कि आपके समाधान के अन्य सभी समाधानों के बारे में क्या है।
nvoigt

वर्ण दोहराए जाने पर दोहराव से बचा जाता है (दूसरे जवाब के लिए चिंदिरला द्वारा)। "आब" के लिए: आब अबा बा
वैल

1

@ पीटर के समाधान पर बिल्डिंग, यहां एक संस्करण है जो एक सरल LINQ- शैली Permutations()विस्तार विधि की घोषणा करता है जो किसी भी पर काम करता है IEnumerable<T>

उपयोग (स्ट्रिंग वर्ण उदाहरण पर):

foreach (var permutation in "abc".Permutations())
{
    Console.WriteLine(string.Join(", ", permutation));
}

आउटपुट:

a, b, c
a, c, b
b, a, c
b, c, a
c, b, a
c, a, b

या किसी अन्य संग्रह प्रकार पर:

foreach (var permutation in (new[] { "Apples", "Oranges", "Pears"}).Permutations())
{
    Console.WriteLine(string.Join(", ", permutation));
}

आउटपुट:

Apples, Oranges, Pears
Apples, Pears, Oranges
Oranges, Apples, Pears
Oranges, Pears, Apples
Pears, Oranges, Apples
Pears, Apples, Oranges
using System;
using System.Collections.Generic;
using System.Linq;

public static class PermutationExtension
{
    public static IEnumerable<T[]> Permutations<T>(this IEnumerable<T> source)
    {
        var sourceArray = source.ToArray();
        var results = new List<T[]>();
        Permute(sourceArray, 0, sourceArray.Length - 1, results);
        return results;
    }

    private static void Swap<T>(ref T a, ref T b)
    {
        T tmp = a;
        a = b;
        b = tmp;
    }

    private static void Permute<T>(T[] elements, int recursionDepth, int maxDepth, ICollection<T[]> results)
    {
        if (recursionDepth == maxDepth)
        {
            results.Add(elements.ToArray());
            return;
        }

        for (var i = recursionDepth; i <= maxDepth; i++)
        {
            Swap(ref elements[recursionDepth], ref elements[i]);
            Permute(elements, recursionDepth + 1, maxDepth, results);
            Swap(ref elements[recursionDepth], ref elements[i]);
        }
    }
}

0

यहाँ फ़ंक्शन है जो सभी क्रमपरिवर्तन को पुनरावर्ती रूप से मुद्रित करेगा।

public void Permutations(string input, StringBuilder sb)
    {
        if (sb.Length == input.Length)
        {
            Console.WriteLine(sb.ToString());
            return;
        }

        char[] inChar = input.ToCharArray();

        for (int i = 0; i < input.Length; i++)
        {
            if (!sb.ToString().Contains(inChar[i]))
            {
                sb.Append(inChar[i]);
                Permutations(input, sb);    
                RemoveChar(sb, inChar[i]);
            }
        }
    }

private bool RemoveChar(StringBuilder input, char toRemove)
    {
        int index = input.ToString().IndexOf(toRemove);
        if (index >= 0)
        {
            input.Remove(index, 1);
            return true;
        }
        return false;
    }

0
class Permutation
{
    public static List<string> Permutate(string seed, List<string> lstsList)
    {
        loopCounter = 0;
        // string s="\w{0,2}";
        var lstStrs = PermuateRecursive(seed);

        Trace.WriteLine("Loop counter :" + loopCounter);
        return lstStrs;
    }

    // Recursive function to find permutation
    private static List<string> PermuateRecursive(string seed)
    {
        List<string> lstStrs = new List<string>();

        if (seed.Length > 2)
        {
            for (int i = 0; i < seed.Length; i++)
            {
                str = Swap(seed, 0, i);

                PermuateRecursive(str.Substring(1, str.Length - 1)).ForEach(
                    s =>
                    {
                        lstStrs.Add(str[0] + s);
                        loopCounter++;
                    });
                ;
            }
        }
        else
        {
            lstStrs.Add(seed);
            lstStrs.Add(Swap(seed, 0, 1));
        }
        return lstStrs;
    }
    //Loop counter variable to count total number of loop execution in various functions
    private static int loopCounter = 0;

    //Non recursive  version of permuation function
    public static List<string> Permutate(string seed)
    {
        loopCounter = 0;
        List<string> strList = new List<string>();
        strList.Add(seed);
        for (int i = 0; i < seed.Length; i++)
        {
            int count = strList.Count;
            for (int j = i + 1; j < seed.Length; j++)
            {
                for (int k = 0; k < count; k++)
                {
                    strList.Add(Swap(strList[k], i, j));
                    loopCounter++;
                }
            }
        }
        Trace.WriteLine("Loop counter :" + loopCounter);
        return strList;
    }

    private static string Swap(string seed, int p, int p2)
    {
        Char[] chars = seed.ToCharArray();
        char temp = chars[p2];
        chars[p2] = chars[p];
        chars[p] = temp;
        return new string(chars);
    }
}

0

यहाँ एक C # उत्तर दिया गया है जो थोड़ा सरल है।

public static void StringPermutationsDemo()
{
    strBldr = new StringBuilder();

    string result = Permute("ABCD".ToCharArray(), 0);
    MessageBox.Show(result);
}     

static string Permute(char[] elementsList, int startIndex)
{
    if (startIndex == elementsList.Length)
    {
        foreach (char element in elementsList)
        {
            strBldr.Append(" " + element);
        }
        strBldr.AppendLine("");
    }
    else
    {
        for (int tempIndex = startIndex; tempIndex <= elementsList.Length - 1; tempIndex++)
        {
            Swap(ref elementsList[startIndex], ref elementsList[tempIndex]);

            Permute(elementsList, (startIndex + 1));

            Swap(ref elementsList[startIndex], ref elementsList[tempIndex]);
        }
    }

    return strBldr.ToString();
}

static void Swap(ref char Char1, ref char Char2)
{
    char tempElement = Char1;
    Char1 = Char2;
    Char2 = tempElement;
}

आउटपुट:

1 2 3
1 3 2

2 1 3
2 3 1

3 2 1
3 1 2

0

यह मेरा समाधान है जिसे समझना मेरे लिए आसान है

class ClassicPermutationProblem
{
    ClassicPermutationProblem() { }

    private static void PopulatePosition<T>(List<List<T>> finalList, List<T> list, List<T> temp, int position)
    {
         foreach (T element in list)
         {
             List<T> currentTemp = temp.ToList();
             if (!currentTemp.Contains(element))
                currentTemp.Add(element);
             else
                continue;

             if (position == list.Count)
                finalList.Add(currentTemp);
             else
                PopulatePosition(finalList, list, currentTemp, position + 1);
        }
    }

    public static List<List<int>> GetPermutations(List<int> list)
    {
        List<List<int>> results = new List<List<int>>();
        PopulatePosition(results, list, new List<int>(), 1);
        return results;
     }
}

static void Main(string[] args)
{
    List<List<int>> results = ClassicPermutationProblem.GetPermutations(new List<int>() { 1, 2, 3 });
}

0

यहाँ उल्लेख किए गए एल्गो का एक और कार्यान्वयन है।

public class Program
{
    public static void Main(string[] args)
    {
        string str = "abcefgh";
        var astr = new Permutation().GenerateFor(str);
        Console.WriteLine(astr.Length);
        foreach(var a in astr)
        {
            Console.WriteLine(a);
        }
        //a.ForEach(Console.WriteLine);
    }
}

class Permutation
{
    public string[] GenerateFor(string s)
    {  

        if(s.Length == 1)
        {

            return new []{s}; 
        }

        else if(s.Length == 2)
        {

            return new []{s[1].ToString()+s[0].ToString(),s[0].ToString()+s[1].ToString()};

        }

        var comb = new List<string>();

        foreach(var c in s)
        {

            string cStr = c.ToString();

            var sToProcess = s.Replace(cStr,"");
            if (!string.IsNullOrEmpty(sToProcess) && sToProcess.Length>0)
            {
                var conCatStr = GenerateFor(sToProcess);



                foreach(var a in conCatStr)
                {
                    comb.Add(c.ToString()+a);
                }


            }
        }
        return comb.ToArray();

    }
}

new Permutation().GenerateFor("aba")आउटपुटstring[4] { "ab", "baa", "baa", "ab" }
एटमोसक

0
    //Generic C# Method
            private static List<T[]> GetPerms<T>(T[] input, int startIndex = 0)
            {
                var perms = new List<T[]>();

                var l = input.Length - 1;

                if (l == startIndex)
                    perms.Add(input);
                else
                {

                    for (int i = startIndex; i <= l; i++)
                    {
                        var copy = input.ToArray(); //make copy

                        var temp = copy[startIndex];

                        copy[startIndex] = copy[i];
                        copy[i] = temp;

                        perms.AddRange(GetPerms(copy, startIndex + 1));

                    }
                }

                return perms;
            }

            //usages
            char[] charArray = new char[] { 'A', 'B', 'C' };
            var charPerms = GetPerms(charArray);


            string[] stringArray = new string[] { "Orange", "Mango", "Apple" };
            var stringPerms = GetPerms(stringArray);


            int[] intArray = new int[] { 1, 2, 3 };
            var intPerms = GetPerms(intArray);

यह बहुत अच्छा होगा यदि आप इस कोड को कैसे काम करते हैं, इसके बारे में थोड़ा विस्तार से बता सकते हैं, बजाय इसे यहां छोड़ने के।
iBug

-1
    /// <summary>
    /// Print All the Permutations.
    /// </summary>
    /// <param name="inputStr">input string</param>
    /// <param name="strLength">length of the string</param>
    /// <param name="outputStr">output string</param>
    private void PrintAllPermutations(string inputStr, int strLength,string outputStr, int NumberOfChars)
    {
        //Means you have completed a permutation.
        if (outputStr.Length == NumberOfChars)
        {
            Console.WriteLine(outputStr);                
            return;
        }

        //For loop is used to print permutations starting with every character. first print all the permutations starting with a,then b, etc.
        for(int i=0 ; i< strLength; i++)
        {
            // Recursive call : for a string abc = a + perm(bc). b+ perm(ac) etc.
            PrintAllPermutations(inputStr.Remove(i, 1), strLength - 1, outputStr + inputStr.Substring(i, 1), 4);
        }
    }        
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.