这是我找到的最简单的代码。对于给定的字符串,它返回true或false,其中提到该字符串是否包含所有字母。
新设置(“任意字符串” .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 :(得分:3)
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 :(得分:1)
这是我找到的最简单的代码,它针对给定的字符串返回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
任何其他最简单的代码形式都可能有帮助。请分享。
谢谢!
答案 2 :(得分:1)
我认为这是“最简单”的做法计算复杂度,只需要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) );
}
}
答案 3 :(得分:1)
您可以避免使用正则表达式,并且一旦所有字母都带有类似的内容,也可以从函数中早返回。它会创建一组所有字母,并在找到它们时将其删除。一旦集合为空,您可以返回。如果循环结束,则不会删除所有内容。这只需要用于字母表集的空间,并且由于设置操作是恒定时间,因此在最坏的情况下为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))
答案 4 :(得分:1)
再次查看时,我可以对您的代码进行一点改进:
new Set("<your_string>".toLowerCase().replace(/[^a-z]/g, "").split("")).size === 26 .
删除正则表达式上的'i'标志,因为它是小写字母。
答案 5 :(得分:0)
以下是使用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'))
答案 6 :(得分:0)
function isPangram(sentence){
let lowerCased = sentence.toLowerCase();
for(let char of 'abcdefghijklmnopqrstuvwxyz'){
if(!lowerCased.includes(char)){
return false
}
}
return true
}
这是使用for ... of循环的另一种方法。