如何检测字符串是否为全字母拼写字母和 return true or false
How to detect wether or not a string is a pangram and return true or false
pangram 是一个包含字母表中的每个字母至少一次的句子。例如,句子“The quick brown fox jumps over the lazy dog”是一个泛语法,因为它至少使用了一次字母 A-Z(不区分大小写)。我正在尝试制作一种方法,该方法采用字符串和 returns true 或 false 来判断它是否是 pangram。这是我到目前为止尝试过的。
def pangram?(string)
letters = string.chars.downcase.uniq
letters.uniq.all? {|c| string.count(c)==26}
end
def pangram?(string)
string.downcase
("a".."z").all?{|c| string.count(c) <= 1}
end
有更好的建议吗?提前致谢!
你可以选择类似的东西:
s.downcase.scan(/[a-z]/).uniq.size == 26
这会降低字符串扫描所有字符“a”到“z”的大小写,并检查这些字符的 uniq 大小是否等于 26。
您当前的解决方案存在问题
第一个永远不会像现在这样工作
chars
returns Array
和 Array#downcase
不是方法
- 您正在检查原始字符串中的每个字母出现 26 次 (
string.count(c)==26
),因此 'a' * 26
将通过此测试,但“The quick brown fox jumps over the lazy dog”不会。
第二个也有问题:
- 第一行毫无用处。它缩小字符串并处理结果
String#count
会效率低下;
''
将通过此测试,因为每个字母出现 0 次。例如<= 1
次。
def pangram?(string)
(("a".."z").to_a - string.downcase.chars).empty?
end
require 'set'
def pangram?(str)
str.downcase.each_char.with_object(('a'..'z').to_set) {|c,st| st.delete(c)}.empty?
end
pangram?("The quick brown dog jumps over the lazy fox") #=> true
pangram?("The quick brown dog jumps over the lazy fo.") #=> false
pangram?("The quick brown dog, Saffi, jumps over the lazy fox.") #=> true
我已经将 'a'..'z'
转换为集合而不是数组,只是为了加快计算速度。
如果字符串很长,一旦找到 26 个不同的字符,return true
可能会更快:
def pangram?(str)
str.downcase.each_char.with_object(('a'..'z').to_set) do |c,st|
st.delete(c)
return true if s.empty?
end
false
end
pangram 是一个包含字母表中的每个字母至少一次的句子。例如,句子“The quick brown fox jumps over the lazy dog”是一个泛语法,因为它至少使用了一次字母 A-Z(不区分大小写)。我正在尝试制作一种方法,该方法采用字符串和 returns true 或 false 来判断它是否是 pangram。这是我到目前为止尝试过的。
def pangram?(string)
letters = string.chars.downcase.uniq
letters.uniq.all? {|c| string.count(c)==26}
end
def pangram?(string)
string.downcase
("a".."z").all?{|c| string.count(c) <= 1}
end
有更好的建议吗?提前致谢!
你可以选择类似的东西:
s.downcase.scan(/[a-z]/).uniq.size == 26
这会降低字符串扫描所有字符“a”到“z”的大小写,并检查这些字符的 uniq 大小是否等于 26。
您当前的解决方案存在问题
第一个永远不会像现在这样工作
chars
returnsArray
和Array#downcase
不是方法- 您正在检查原始字符串中的每个字母出现 26 次 (
string.count(c)==26
),因此'a' * 26
将通过此测试,但“The quick brown fox jumps over the lazy dog”不会。
第二个也有问题:
- 第一行毫无用处。它缩小字符串并处理结果
String#count
会效率低下;''
将通过此测试,因为每个字母出现 0 次。例如<= 1
次。
def pangram?(string)
(("a".."z").to_a - string.downcase.chars).empty?
end
require 'set'
def pangram?(str)
str.downcase.each_char.with_object(('a'..'z').to_set) {|c,st| st.delete(c)}.empty?
end
pangram?("The quick brown dog jumps over the lazy fox") #=> true
pangram?("The quick brown dog jumps over the lazy fo.") #=> false
pangram?("The quick brown dog, Saffi, jumps over the lazy fox.") #=> true
我已经将 'a'..'z'
转换为集合而不是数组,只是为了加快计算速度。
如果字符串很长,一旦找到 26 个不同的字符,return true
可能会更快:
def pangram?(str)
str.downcase.each_char.with_object(('a'..'z').to_set) do |c,st|
st.delete(c)
return true if s.empty?
end
false
end