Listing all permutations of a string/integer

后端 未结 29 1990
没有蜡笔的小新
没有蜡笔的小新 2020-11-22 00:44

A common task in programming interviews (not from my experience of interviews though) is to take a string or an integer and list every possible permutation.

Is there

相关标签:
29条回答
  • 2020-11-22 01:32

    Recursion is not necessary, here is good information about this solution.

    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();
    

    I have been used this algorithm for years, it has O(N) time and space complexity to calculate each permutation.

    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;
        }
    }
    
    0 讨论(0)
  • 2020-11-22 01:32
        /// <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);
            }
        }        
    
    0 讨论(0)
  • 2020-11-22 01:33

    The below is my implementation of permutation . Don't mind the variable names, as i was doing it for fun :)

    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;
    
        }
    }
    
    0 讨论(0)
  • 2020-11-22 01:34
        //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);
    
    0 讨论(0)
  • 2020-11-22 01:35

    Here is a simple solution in c# using recursion,

    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)));
            }
        }
    }
    
    0 讨论(0)
  • 2020-11-22 01:35

    Here is a C# answer which is a little simplified.

    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;
    }
    

    Output:

    1 2 3
    1 3 2
    
    2 1 3
    2 3 1
    
    3 2 1
    3 1 2
    
    0 讨论(0)
提交回复
热议问题