Проверьте, может ли строка быть сделана символами другой строки в C # - PullRequest
8 голосов
/ 02 апреля 2011

Как проверить, можно ли составить слово буквами другого слова.использование каждой буквы только один раз.

Пример:

если str = "computer";, то

//if user enters below words output must be true
  comp
  put
  poet

//and if user enters below words output must be false
  count         // since n is not in str 
  root          // since there is only single o in str    

Ответы [ 2 ]

5 голосов
/ 02 апреля 2011

Это решение, основанное на подсчете количества каждого символа и проверке того, что во втором слове меньше каждого символа:

public static bool UsesSameLetters(string input, string check)
{
    var OriginalCounts = input.GroupBy(c => c)
        .ToDictionary(g => g.Key, g => g.Count());
    bool Success = check.GroupBy(c => c)
        .All(originalCounts.ContainsKey(g.Key) 
            && originalCounts[g.Key] >= g.Count);
    return Success;
}

Это решение подсчитывает количество каждого символа во входной строке, а затем проверяет, встречается ли каждый символ в строке проверки меньше раз, чем во входной строке. Это решение довольно декларативное.

3 голосов
/ 02 апреля 2011

Следующее должно сделать трюк

public static bool UsesSameLetters(string input, string check) {
  var array = new BitArray(check.Length, false);
  for (var i = 0; i < input.Length; i++) {   
    var found = false;
    for (var j = 0; j < check.Length; j++) {
      if (input[i] == check[j] && !array.Get(j)) {
        array.Set(j, true);
        found = true;
        break;
      }
    }
    if (!found) {
      return false;
    }
  }
  return true;
}
...