这是我发现的最简单的代码。对于给定的字符串,它返回true或false,提示字符串包含或不包含所有字母。
new Set(“any 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
任何其他最简单的代码形式都会有所帮助。请分享。
谢谢!
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()
我相信这是“最简单的”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) );
}
}
当我再次看到它时,我可以为您的代码提供一个小小的改进:
new Set("<your_string>".toLowerCase().replace(/[^a-z]/g, "").split("")).size === 26 .
删除正则表达式中的“i”标志,因为它是小写的。
你可以避免使用正则表达式,并且一旦你拥有这样的所有字母,也可以从函数中提前返回。它会创建一组所有字母,并在找到它们时将其删除。一旦设置为空,您就可以返回。如果循环结束,则表示您没有删除所有内容。这仅需要字母集的空间,并且因为设置操作是恒定时间,所以在最坏的情况下这是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))
这是我找到的最简单的代码,它对于给定的字符串返回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
任何其他最简单的代码形式都会有所帮助。请分享。
谢谢!
这是使用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'))