ruby – 快速的字谜解决

鉴于两个字符串,我想确定它们是否是彼此的字谜.这是我提出的解决方案:
# output messages
def anagram
    puts "Anagram!"
    exit 
end

def not_anagram
    puts "Not an anagram!"
    exit
end

# main method
if __FILE__ == $0
   # read two strings from the command line
   first,second = gets.chomp,gets.chomp

   # special case 1
   not_anagram if first.length != second.length

   # special case 2
   anagram if first == second

   # general case
   # Two strings must have the exact same number of characters in the
   # correct case to be anagrams.
   # We can sort both strings and compare the results
   if first.chars.sort.join == second.chars.sort.join
      anagram
   else
      not_anagram
   end
end

但我认为可能有一个更好的.我分析了这个解决方案的效率,并得出:

> chars:将字符串拆分为字符数组O(n)
> sort:按字母顺序对字符串进行排序,我不知道如何在Ruby中实现排序,但我假设为O(n log n),因为这是通常最为人所知的排序效率
> join:从字符数组O(n)构建一个字符串
> ==:字符串比较本身必须检查字符串2 * O(n)的每个字符

鉴于上述情况,我将整个解决方案的效率分类为O(n log n),因为排序效率最高.有没有比O(n log n)更有效的方法呢?

解决方法

你的大O应该是O(n * lg(n))因为排序是限制功能.如果你尝试使用非常大的字谜,你会发现O(n)解决方案的性能损失高于预期.

您可以通过比较两个字符映射中的计数来执行O(n)解决方案=>人物数量.

肯定有其他解决方案具有大致相同的复杂性,但我认为你不能提出任何比O(n)更快的解决方

相关文章

以下代码导致我的问题: class Foo def initialize(n=0) @n = n end attr_accessor :n d...
这是我的spec文件,当为上下文添加测试“而不是可单独更新用户余额”时,我得到以下错误. require 's...
我有一个拦截器:DevelopmentMailInterceptor和一个启动拦截器的inititializer setup_mail.rb. 但我想将...
例如,如果我有YAML文件 en: questions: new: 'New Question' other: recent: ...
我听说在RSpec中避免它,let,let !,指定,之前和主题是最佳做法. 关于让,让!之前,如果不使用这些,我该如...
我在Rails中使用MongoDB和mongo_mapper gem,项目足够大.有什么办法可以将数据从Mongoid迁移到 Postgres...