Как проверить, есть ли буквы в строке? - PullRequest
2 голосов
/ 09 ноября 2011

Это довольно сложный вопрос, но я постараюсь.У меня есть 4 письма m u g o.У меня также есть свободное слово ( s ).Давайте: og ogg muogss.Я ищу любой мудрый метод, чтобы проверить, могу ли я построить слово ( s ), используя только мои буквы.Пожалуйста, обратите внимание, что мы использовали один раз g, мы не сможем использовать его снова.

og - possible because we need only **g** and **o**
ogg - not possible we took **o** and **g**, need the second **g**
muogss - not possible we took all, need also additional **s**

Так что моя тактика состоит в том, чтобы перебирать мои письма в массив символов и удалять их по одному и проверять, сколько осталосьпостроить слово ( s ).Но можно ли использовать как-нибудь в несколько строк, я не знаю - регулярное выражение?

Ответы [ 3 ]

7 голосов
/ 09 ноября 2011

Ваш метод состоит всего из нескольких строк ...

   public static bool CanBeMadeFrom(string word, string letters)
    {
        foreach (var i in word.Select(c => letters.IndexOf(c, 0)))
        {
            if (i == -1) return false;
            letters = letters.Remove(i, 1);
        }
        return true;
    }
3 голосов
/ 09 ноября 2011

Вот простой подход: Для вашего исходного слова создайте массив размером 26 и используйте его, чтобы подсчитать, сколько раз появляется каждая буква. Сделайте то же самое для каждого слова в вашем словаре. Тогда сравните два. Если каждая буква встречается в словарном слове меньше или равно столько раз, что и исходное слово, то ее можно использовать для создания этого слова. Если нет, то не может.

C-Sharpish Pseudocode: (вероятно, не компилируется как написано)

/** Converts characters to a 0 to 25 code representing alphabet position.
    This is specific to the English language and would need to be modified if used
    for other languages. */
int charToLetter(char c) {
    return Char.ToUpper(c)-'A';
}

/** Given a source word and an array of other words to check, returns all 
    words from the array which can be made from the letters of the source word. */
ArrayList<string> checkSubWords(string source, string[] dictionary) {

    ArrayList<string> output = new ArrayList<string>();

    // Stores how many of each letter are in the source word.
    int[] sourcecount = new int[26];  // Should initialize to 0, automatically
    foreach (char c in source) {
        sourcecount[c]++;
    }

    foreach (string s in dictionary) {

        // Stores how many of each letter are in the dictionary word.
        int[] dictcount = new int[26]; // Should initialize to 0, automatically
        foreach (char c in s) {
            dictcount[c]++;
        }

        // Then we check that there exist no letters which appear more in the 
        // dictionary word than the source word.
        boolean isSubword = true;
        for (int i=0;i<26;i++) {
            if (dictcount[i] > sourcecount[i]) {
                isSubword = false;
            }
        }

        // If they're all less than or equal to, then we add it to the output.
        if (isSubWord) {
            output.add(s);
        }
    }
    return output;
}
0 голосов
/ 09 ноября 2011

Если ваше определение слов - это произвольная перестановка доступных символов, то зачем вам регулярное выражение?Просто убедитесь, что вы используете каждый символ один раз.Regex не знает, что такое «правильное слово» , и лучше избегать использования недопустимых символов в ваших алгоритмах, чем использовать их AND , используя Regex, чтобы убедиться, что вы этого не сделалииспользуйте их.

...