You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 21:36:04