Esempio n. 1
0
        private static string FindMaxMergePair(CharInfo ci, int idx, char[] result, StringChar lastSuccessfulChar)
        {
            if (idx == result.Length)
            {
                return(new string(result));
            }

            string     s = null;
            StringChar lastFailedChar = null;

            while (s == null)
            {
                StringChar sc = ci.RemoveMaxPossibleChar(lastSuccessfulChar, lastFailedChar);
                if (sc == null)
                {
                    return(null);
                }

                result[idx] = sc.c;
                s           = FindMaxMergePair(ci, idx + 1, result, sc);
                if (s == null)
                {
                    lastFailedChar = sc;
                    ci.AddChar(sc);
                }
            }

            return(s);
        }
Esempio n. 2
0
            //public bool CharAvailable(StringChar lastChar)
            //{
            //    return lastChar == null ? true : remainingChars.Count > 0;
            //}

            public StringChar RemoveMaxPossibleChar(StringChar lastSuccessfulChar, StringChar lastFailedChar)
            {
                int lastIdx = lastSuccessfulChar != null ? lastSuccessfulChar.idx : -1;

                for (char c = 'z'; c >= 'a'; c--)
                {
                    if (!remainingCountsByChar.ContainsKey(c) ||
                        remainingCountsByChar[c] == 0 ||
                        (lastFailedChar != null && c >= lastFailedChar.c))
                    {
                        // avoid chars that are not part of the word, or are complete, or failed before
                        continue;
                    }

                    if (remainingChars.ContainsKey(c))
                    {
                        List <StringChar> indexes = remainingChars[c];
                        for (int i = 0; i < indexes.Count; i++)
                        {
                            StringChar sc = indexes[i];
                            if (sc.available && sc.idx > lastIdx && sc.idx + remainingCount < s.Length - 1)
                            {
                                sc.available = false;
                                remainingCountsByChar[sc.c]--;
                                remainingCount--;
                                return(sc);
                            }
                        }
                    }
                }

                return(null);
            }
Esempio n. 3
0
 private StringChar FindChar(StringChar sc, List <StringChar> lst)
 {
     for (int i = 0; i < lst.Count; i++)
     {
         if (lst[i].idx == sc.idx)
         {
             return(lst[i]);
         }
     }
     return(null);
 }
Esempio n. 4
0
            public override bool Equals(object o)
            {
                if (!(o is StringChar))
                {
                    return(false);
                }

                StringChar r = (StringChar)o;

                return(this.Value.Equals(r.Value));
            }
Esempio n. 5
0
            public void AddChar(StringChar sc)
            {
                if (!remainingChars.ContainsKey(sc.c))
                {
                    remainingChars[sc.c] = new List <StringChar>();
                }

                StringChar existing = FindChar(sc, remainingChars[sc.c]);

                if (existing == null)
                {
                    remainingChars[sc.c].Add(sc);
                }
                else
                {
                    existing.available = true;
                }

                if (remainingCountsByChar != null)
                {
                    remainingCountsByChar[sc.c]++;
                    remainingCount++;
                }
            }