Finding the ranking of a word (permutations) with duplicate letters

前端 未结 6 634
有刺的猬
有刺的猬 2020-11-27 07:09

I\'m posting this although much has already been posted about this question. I didn\'t want to post as an answer since it\'s not working. The answer to this post (Finding th

6条回答
  •  臣服心动
    2020-11-27 07:35

    @Dvaid Einstat, this was really helpful. It took me a WHILE to figure out what you were doing as I am still learning my first language(C#). I translated it into C# and figured that I'd give that solution as well since this listing helped me so much!

    Thanks!

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Text.RegularExpressions;
    
    namespace CsharpVersion
    {
        class Program
        {
            //Takes in the word and checks to make sure that the word
            //is between 1 and 25 charaters inclusive and only
            //letters are used
            static string readWord(string prompt, int high)
            {
                Regex rgx = new Regex("^[a-zA-Z]+$");
                string word;
                string result;
                do
                {
                    Console.WriteLine(prompt);
                    word = Console.ReadLine();
                } while (word == "" | word.Length > high | rgx.IsMatch(word) == false);
                result = word.ToUpper();
                return result;
            }
    
            //Creates a sorted dictionary containing distinct letters 
            //initialized with 0 frequency
            static SortedDictionary Counter(string word)
            {
                char[] wordArray = word.ToCharArray();
                int len = word.Length;
                SortedDictionary count = new SortedDictionary();
               foreach(char c in word)
               {
                   if(count.ContainsKey(c))
                   {
                   }
                   else
                   {
                       count.Add(c, 0);
                   }
    
               }
               return count;
            }
    
            //Creates a factorial function
            static int Factorial(int n)
            {
                if (n <= 1)
                {
                    return 1;
                }
                else
                {
                    return n * Factorial(n - 1);
                }
            }
            //Ranks the word input if there are no repeated charaters 
            //in the word
            static Int64 rankWord(char[] wordArray)
            {
                int n = wordArray.Length; 
                Int64 rank = 1; 
                //loops through the array of letters
                for (int i = 0; i < n-1; i++) 
                { 
                    int x=0; 
                //loops all letters after i and compares them for factorial calculation
                    for (int j = i+1; j wordArray[j]) 
                        {
                            x++;
                        }
                    }
                    rank = rank + x * (Factorial(n - i - 1)); 
                 }
                return rank;
            }
    
            //Ranks the word input if there are repeated charaters
            //in the word
            static Int64 rankPerm(String word) 
            {
            Int64 rank = 1;
            Int64 suffixPermCount = 1;
            SortedDictionary counter = Counter(word);
            for (int i = word.Length - 1; i > -1; i--) 
            {
                char x = Convert.ToChar(word.Substring(i,1));
                int xCount;
                if(counter[x] != 0) 
                {
                    xCount = counter[x] + 1; 
                }
                else
                {
                   xCount = 1;
                }
                counter[x] = xCount;
                foreach (KeyValuePair e in counter)
                {
                    if (e.Key < x)
                    {
                        rank += suffixPermCount * e.Value / xCount;
                    }
                }
    
                suffixPermCount *= word.Length - i;
                suffixPermCount /= xCount;
            }
            return rank;
            }
    
    
    
    
            static void Main(string[] args)
            {
               Console.WriteLine("Type Exit to end the program.");
               string prompt = "Please enter a word using only letters:";
               const int MAX_VALUE = 25;
               Int64 rank = new Int64();
               string theWord;
               do
               {
                   theWord = readWord(prompt, MAX_VALUE);
                   char[] wordLetters = theWord.ToCharArray();
                   Array.Sort(wordLetters);
                   bool duplicate = false;
                   for(int i = 0; i< theWord.Length - 1; i++)
                   {
                     if(wordLetters[i] < wordLetters[i+1])
                     {
                         duplicate = true;
                     }
                   }
                   if(duplicate)
                   {
                   SortedDictionary counter = Counter(theWord);
                   rank = rankPerm(theWord);
                   Console.WriteLine("\n" + theWord + " = " + rank);
                   }
                   else
                   {
                   char[] letters = theWord.ToCharArray();
                   rank = rankWord(letters);
                   Console.WriteLine("\n" + theWord + " = " + rank);
                   }
               } while (theWord != "EXIT");
    
                Console.WriteLine("\nPress enter to escape..");
                Console.Read();
            }
        }
    }
    

提交回复
热议问题