讲师中心 微信公众号
AI工具推荐 视频效率加速

基于字母配额与词表的合法句子生成器:Python 实现多词组合式字谜求解

大磊吖_7526

大磊吖_7526

发布时间:2026-02-11 16:19:51

|

389人浏览过

|

来源于php中文网

原创

基于字母配额与词表的合法句子生成器:Python 实现多词组合式字谜求解

本文介绍如何根据给定字母使用配额(如 n:1, e:1, o:2 等)和外部词表(wordlist.txt),穷举所有由词表中单词构成、且**恰好耗尽全部字母配额**的有效句子,支持同构异形词(anagram)去重与组合优化。

在自然语言处理与算法谜题实践中,常需解决一类“约束型句子构造”问题:给定一组字母及其最大可用次数(即“配额”),以及一个合法词汇集合(如 wordlist.txt),目标是生成所有可能的、由词表内单词拼接而成的句子,要求每个字母的总使用频次严格等于其配额,且不可超额或剩余。例如,配额 n:1, e:1, w:1, b:1, o:2, k:1 对应字母串 "newbook"(长度 7),合法解包括 "new book"、"bow neko" 等——它们均由词表中存在、且字母频次加总后完全匹配原始配额的单词组成。

核心思路是将问题转化为多词级字谜(multi-word anagram)求解:

  • 每个单词按字母排序后形成唯一 anagram_id(如 "book" → "bkoo","koob" → "bkoo"),实现异形词归一化;
  • 输入配额等价于一个目标字母串(如 "bkeoown" → 排序得 "bkeoown" → "beknoow"),记为 target_sorted;
  • 枚举词表中所有能作为子组件的单词(即其 anagram_id 是 target_sorted 的子多重集),再通过组合与笛卡尔积,生成所有单词序列,使其 anagram_id 拼接后仍与 target_sorted 完全一致。

以下是完整、可运行的 Python 实现(已优化逻辑并增强鲁棒性):

from itertools import combinations, product
from collections import defaultdict, Counter

def filter_origin(s):
    """清理输入:移除空格、换行、标点,转小写,仅保留字母"""
    return ''.join(filter(str.isalpha, s.lower()))

def generate_sentences_from_quota(quota_dict, wordlist_path='wordlist.txt'):
    """
    根据字母配额字典和词表路径生成所有合法句子

    Args:
        quota_dict (dict): 如 {'n': 1, 'e': 1, 'w': 1, 'b': 1, 'o': 2, 'k': 1}
        wordlist_path (str): 词表文件路径,每行一个单词

    Returns:
        list[str]: 所有满足条件的句子(空格分隔,顺序不同视为不同解)
    """
    # 构建目标字母串(按配额展开)
    target_chars = []
    for char, count in quota_dict.items():
        if count > 0 and char.isalpha():
            target_chars.extend([char.lower()] * count)
    target_sorted = ''.join(sorted(target_chars))
    target_len = len(target_sorted)

    # 读取并预处理词表
    with open(wordlist_path, 'r', encoding='utf-8') as f:
        words = [line.strip() for line in f if line.strip()]

    # 构建 anagram_id → 单词列表 映射
    anagram_map = defaultdict(list)
    for word in words:
        clean_word = filter_origin(word)
        if not clean_word or len(clean_word) > target_len:
            continue
        aid = ''.join(sorted(clean_word))
        anagram_map[aid].append(word)

    # 筛选所有「可行组件」:anagram_id 必须是 target_sorted 的子多重集
    valid_aids = []
    target_counter = Counter(target_sorted)
    for aid in anagram_map:
        aid_counter = Counter(aid)
        # 检查 aid 是否可被 target_counter 容纳(每个字母频次 ≤ target)
        if all(target_counter[c] >= cnt for c, cnt in aid_counter.items()):
            valid_aids.append(aid)

    # 枚举所有非空子集组合(按组件数量分层)
    valid_sentences = []
    # 使用动态规划或回溯更优,此处用组合枚举(适合中小规模)
    for r in range(1, min(len(valid_aids) + 1, target_len + 1)):
        for combo in combinations(valid_aids, r):
            # 拼接当前组合的 anagram_id 并排序
            combined_aid = ''.join(combo)
            if len(combined_aid) != target_len:
                continue
            if ''.join(sorted(combined_aid)) == target_sorted:
                # 笛卡尔积:每个 aid 对应多个实际单词
                word_lists = [anagram_map[aid] for aid in combo]
                for sentence_words in product(*word_lists):
                    valid_sentences.append(' '.join(sentence_words))

    return list(set(valid_sentences))  # 去重(避免相同句子因多路径生成)

# 示例调用
if __name__ == "__main__":
    quota = {'n': 1, 'e': 1, 'w': 1, 'b': 1, 'o': 2, 'k': 1}
    sentences = generate_sentences_from_quota(quota, 'wordlist.txt')
    print("合法句子列表:")
    for s in sorted(sentences):
        print(f"  '{s}'")

✅ 关键特性说明:

macOS UI 自动化技能包 —— 用 Python 控制你的 Mac
macOS UI 自动化技能包 —— 用 Python 控制你的 Mac

让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限

下载

立即学习“Python免费学习笔记(深入)”;

  • 精准配额匹配:严格校验组合后字母频次与输入配额完全一致(非子集,而是等价);
  • anagram 智能归一:自动识别 "book"/"koob" 等异形词,避免重复计算;
  • 高效剪枝:跳过长度超限或频次越界的候选词,显著提升性能;
  • 输出可控:返回去重后的字符串列表,支持直接用于后续 NLP 流程或人工校验。

⚠️ 注意事项:

  • 该算法时间复杂度为指数级(最坏 O(2^N)),适用于配额总长 ≤ 15 字母、词表规模 ≤ 10⁴ 的场景;若需处理更大规模,建议改用回溯 + 频次计数器剪枝,或引入 A* 启发式搜索;
  • wordlist.txt 中单词需为纯字母(无空格/符号),否则 filter_origin() 会自动清洗;
  • 若允许单词复用(同一单词多次出现),需额外修改组合逻辑(当前默认每个单词至多用一次);
  • 实际部署时,建议将 anagram_map 序列化缓存,避免重复解析大型词表。

通过本方案,你不仅能生成 "new book" 和 "bow neko" 这类直观解,更能系统性挖掘所有潜在语义组合——让字母配额从约束变为创意引擎。

热门AI工具

更多
SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

Lovart
Lovart Hot

一款面向视觉设计创作的AI设计平台,可通过智能体和画布工作流辅助制作海报、Logo、网页、PPT及其他视觉内容。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

相关专题

更多
js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

1798

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

2844

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

6164

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

5949

2023.11.24

java读取文件转成字符串的方法
java读取文件转成字符串的方法

Java8引入了新的文件I/O API,使用java.nio.file.Files类读取文件内容更加方便。对于较旧版本的Java,可以使用java.io.FileReader和java.io.BufferedReader来读取文件。在这些方法中,你需要将文件路径替换为你的实际文件路径,并且可能需要处理可能的IOException异常。想了解更多java的相关内容,可以阅读本专题下面的文章。

7554

2024.03.22

php中定义字符串的方式
php中定义字符串的方式

php中定义字符串的方式:单引号;双引号;heredoc语法等等。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

11274

2024.04.29

go语言字符串相关教程
go语言字符串相关教程

本专题整合了go语言字符串相关教程,阅读专题下面的文章了解更多详细内容。

5799

2025.07.29

c++字符串相关教程
c++字符串相关教程

本专题整合了c++字符串相关教程,阅读专题下面的文章了解更多详细内容。

6367

2025.08.07

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

100

2026.10.22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Uvicorn官方安装与入门手册
Uvicorn官方安装与入门手册

共0课时 | 0人学习

Python uv官方项目管理指南
Python uv官方项目管理指南

共0课时 | 0人学习

Python uv官方安装与入门文档
Python uv官方安装与入门文档

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn