首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何检测字符串是否为pangram并返回true或false

如何检测字符串是否为pangram并返回true或false
EN

Stack Overflow用户
提问于 2021-01-21 16:34:02
回答 3查看 501关注 0票数 0

pangram是一个包含字母表中每一个字母至少一次的句子。例如,“飞快的棕色狐狸跳过懒狗”这个句子是一个庞加姆,因为它至少使用一次字母A(大小写无关)。我正在尝试创建一个方法,它接受一个字符串并返回true或false,如果它是pangram的话。这就是我到目前为止尝试过的。

代码语言:javascript
运行
复制
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

有更好的建议吗?提前感谢!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-01-21 17:01:56

你可以做这样的事情:

代码语言:javascript
运行
复制
s.downcase.scan(/[a-z]/).uniq.size == 26 

这将减少字符串扫描所有字符"a“到"z”,并检查这些字符的uniq大小是否等于26。

当前解决方案的问题

第一个永远不会像现在这样工作

  1. chars返回一个Array,而Array#downcase不是一个方法
  2. ,您正在检查原始字符串中的每个字母是否发生了26次(string.count(c)==26),因此'a' * 26将通过这个测试,但是“快速的棕色狐狸跳过懒惰的狗”不会。

第二个问题也有:

  1. ,第一行没有用。当每个字母发生0次时,它将关闭字符串并将result
  2. String#count处理为inefficient;
  3. '',将通过此测试。例如:<= 1 times.
票数 4
EN

Stack Overflow用户

发布于 2021-01-21 17:34:09

代码语言:javascript
运行
复制
def pangram?(string)
  (("a".."z").to_a - string.downcase.chars).empty?
end
票数 1
EN

Stack Overflow用户

发布于 2021-01-21 19:01:14

代码语言:javascript
运行
复制
require 'set'
代码语言:javascript
运行
复制
def pangram?(str)
  str.downcase.each_char.with_object(('a'..'z').to_set) {|c,st| st.delete(c)}.empty?
end
代码语言:javascript
运行
复制
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个不同的字符,返回true可能会更快:

代码语言:javascript
运行
复制
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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65831749

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档