Самый простой код, чтобы проверить, содержит ли строка весь алфавит, используя JavaScript - PullRequest
0 голосов
/ 23 марта 2019

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

new Set ("любая строка" .toLowerCase (). Replace (/ [^ az] /g, "")) .size === 26

Пример:

new Set("A quick brown fox jumps over the lazy dog"
    .toLowerCase()
    .replace(/[^a-z]/g, ""))
    .size === 26

Может пригодиться любая другая простейшая форма кода.Пожалуйста, поделитесь.

Спасибо!

Ответы [ 6 ]

3 голосов
/ 23 марта 2019

Вам не нужно split

Как оказалось, вам не нужно запускать String#split перед передачей вашей строки в new Set.Конструктор для Set, когда передается строка, по сути, разбивает ее на отдельные символы перед созданием набора.

Пример:

new Set('A quick brown fox jumps over the lazy dog'
  .toLowerCase()
  .replace(/[^a-z]/g, '')
).size === 26

Это работает так же хорошопотому что что-то вроде new Set('test') превращается в

Set(3) {"t", "e", "s"}

На заметке, вы можете видеть, что я удалил флаг i из регулярного выражения, как указано однимиз других ответов, поскольку это не нужно из-за .toLowerCase()

1 голос
/ 23 марта 2019

Когда я снова посмотрю на это, я могу предоставить вам одно маленькое улучшение:

new Set("<your_string>".toLowerCase().replace(/[^a-z]/g, "").split("")).size === 26 .

Уберите флаг 'i' в регулярном выражении, потому что он в нижнем регистре.

1 голос
/ 23 марта 2019

Вы можете отказаться от регулярного выражения, а также рано вернуться из функции, как только у вас будут все буквы с чем-то вроде этого. Он создает набор всех букв и удаляет их по мере их нахождения. Как только набор пуст, вы можете вернуться. Если цикл заканчивается, вы не удалили все. Это требует только места для набора алфавита, и поскольку операции набора являются постоянным временем, в худшем случае это O (n).

function allLetters(str){
    let alpha = new Set("abcdefghijklmnopqrstuvwxyz")
    for (let c of str.toLowerCase()){
        alpha.delete(c)
        if (alpha.size == 0) return true
    }
    return false
}

let text = "hello my name if gunther"
let text2 = "The quick brown fox jumps over the lazy dog"

console.log(allLetters(text))
console.log(allLetters(text2))
1 голос
/ 23 марта 2019

Я считаю, что это "самый простой" w.r.t. сложность вычислений, требующая пространства O(1) (для хранения таблицы частот символов, предполагающего фиксированный верхний предел возможного входного алфавита) и O(n) времени, поскольку он повторяется по входной строке только один раз (плюс постоянное время для окончательной проверки над строкой alphabet).

var inputString = "Jaded zombies acted quaintly but kept driving their oxen forward";

var charCounts = {};
for( var i = 0; i < inputString.length; i++ ) {
    var c = inputString.at( i ).toLower();
    if( charCounts[c] ) charCounts[c]++;
    else                charCounts[c] = 1;
}

var alphabet = "abcdefghijklmnopqrstuvwyz";
for( var a = 0; a < alphabet.length; a++ ) {
    if( !charCounts[ alphabet.at(a) ] ) {
        console.log( "char %s does not appear in input string.", alphabet.at(a) );
    }
}
1 голос
/ 23 марта 2019

Это самый простой код, который я нашел, он возвращает true или false для данной строки, упоминая, что строка содержит весь алфавит или нет.

new Set("<your_string>".toLowerCase().replace(/[^a-z]/g, "") ).size === 26

Пример:

new Set("A quick brown fox jumps over the lazy dog".toLowerCase().replace(/[^a-z]/g, "") ).size === 26

Может пригодиться любая другая простейшая форма кода. Пожалуйста, поделитесь им.

Спасибо!

0 голосов
/ 23 марта 2019

Вот другой способ получить его, используя String.fromCharCode() и every()

const allLetters = (str) => Array.from({length:26}).map((x,i) => String.fromCharCode(i+97)).every(a => str.toLowerCase().includes(a));
console.log(allLetters("abcdefghijklmnopqrstuvwxyz"));

Или вы можете жестко закодировать все алфавиты.

const allLetters = (str) => [..."abcdefghijklmnopqrstuvwxyz"].every(x => str.toLowerCase().includes(x));

console.log(allLetters('abcdefghijklmnopqrstuvwxyz'))
console.log(allLetters('abcdefghijklmnopqyz'))
...