Ruby如何查找JSON字典中可由输入字母重排得到的所有单词
实现方案
首先你原有代码存在两个需要修正的问题:
- 没有引入Ruby标准库的JSON模块,直接用
split读取JSON格式的词典文件,会得到包含括号、引号的错误字符串,无法正常匹配单词 - 缺少排列结果和词典内容的匹配逻辑
基于你现有permutation方法的完整实现
直接复用你已经写好的全排列逻辑,匹配词典内容即可:
# 引入JSON标准库解析词典文件 require 'json' class LetterLocater # 修正JSON文件读取方法,正确解析数组格式的dic.json def get_file_contents JSON.parse(File.read('dic.json')) end # 你原有已实现的全排列方法保持不变 def permutation(letters) return [''] if letters.empty? (0...letters.size).flat_map { |i| chr, rest = letters[i], letters[0...i] + letters[i+1..-1] permutation(rest).map { |sub| chr + sub } } end # 新增匹配方法,关联两个功能 def search(input_letters) # 生成输入字母的所有排列,去重避免重复匹配 all_possible = permutation(input_letters).uniq # 加载词典内容 dict = get_file_contents # 取两个数组的交集,即为同时存在于排列结果和词典中的单词 all_possible & dict end end # 调用测试 a = LetterLocater.new input = gets.chomp.downcase # 输出结果数组 puts a.search(input).inspect
输入ab时,上述代码会输出["ab", "ba"],和你预期的结果一致。
更高性能的优化方案(无需生成全排列)
当输入字母较多时,全排列的时间复杂度为O(n!),性能极差。可以利用「变位词排序后字符顺序完全一致」的特性实现,比对效率提升非常明显:
require 'json' class LetterLocater def get_file_contents JSON.parse(File.read('dic.json')) end def search(input_letters) # 把输入字母排序成基准字符串 sorted_input = input_letters.chars.sort.join # 遍历词典,筛选出排序后和基准字符串相等的单词 get_file_contents.select do |word| word.chars.sort.join == sorted_input end end end # 调用逻辑不变 a = LetterLocater.new input = gets.chomp.downcase puts a.search(input).inspect
内容的提问来源于stack exchange,提问作者rubyreact
相关产品推荐
相关产品推荐

