634 · 单词矩阵

news2024/9/20 18:48:53

链接:LintCode 炼码 - ChatGPT!更高效的学习体验!

. - 力扣(LeetCode)

题解:

class Solution {
public:
struct Trie {
    Trie() {
        next.resize(26, nullptr);
        end = false;
    }
std::vector<Trie*> next;
bool end;
};
Trie* insert_trie(vector<string>& words) {
    Trie* root = new (std::nothrow)Trie;
    for (auto& word : words) {
        Trie* cur = root;
        for (int i = 0; i < word.size(); ++i) {
            if (cur->next[word[i]-'a'] == nullptr) {
                cur->next[word[i]-'a'] = new (std::nothrow) Trie;
            }
            cur = cur->next[word[i]-'a'];
        }
        cur->end = true;
    }
    return root;
}
    vector<string> maxRectangle(vector<string>& words) {
        if (words.size() <= 0) {
            return {};
        }
        Trie* root = insert_trie(words);
        if (!root) {
            return {};
        }
        // 构建相同长度的表
        int max_word_len = 0; // 
        std::unordered_map<int, std::unordered_set<string>> len2words;
        for (auto& word : words) {
            int len = word.size();
            max_word_len = max(max_word_len, len);
            len2words[len].insert(word);
        }
        // 回溯
        // 最终结果,总共字符串的长度
        int max_len = 0;
        // 记录回溯路径
        std::vector<string> path;
        // 记录最终结果
        std::vector<string> result;
        for (auto& entry : len2words) {
            path.clear();
            dfs(root, entry.first, entry.second, path, result, max_len, max_word_len);
        }
        return result;
    }
private:
    void dfs(Trie* root, int len, unordered_set<string>& words,
        std::vector<std::string>& path,
        std::vector<std::string>& result,
        int& max_len,
        int max_word_len) {
        // 如果当前字符的长度*宽度比最大的小,直接返回,剪枝
        if (len * len <= max_len) {
            return;
        }
        for (auto& word : words) {
            // 把当前字符追加到路径 中
            path.push_back(word);
            // 判断已经追加的字符串是否是正确额度
            auto valid = is_valid(path, root);
            if (valid.first) {
                // 获得字符串矩形的面积
                int tmp_len = path[0].size() * path.size();
                if (valid.second && tmp_len > max_len) {
                    // 记录最大面积
                    max_len = tmp_len;
                    std::vector<string> tmp(path);
                    result = std::move(tmp);
                }
                // 递归下一层
                dfs(root, len, words, path, result, max_len, max_word_len);
            }
            // 回溯
            path.pop_back();
        }
    }
    std::pair<int, int> is_valid(std::vector<std::string>& path, Trie* root) {
        int word_len = path[0].size();
        int row_size = path.size();
        bool allend = true;
        /*for (auto& tmp : path) {
            cout << tmp << " ";
        }
        cout << endl;*/
        // 判断字符矩阵,按照列查看是否,字符串在字典树中
        for (int i = 0; i < word_len; ++i) {
            Trie* cur = root;
            for (int j = 0; j < row_size; ++j) {
                if (cur->next[path[j][i]-'a'] == nullptr) {
                    return std::pair<int, int>(false, false);
                }
                cur = cur->next[path[j][i]-'a'];
            }
            // 如果当前字符不是结尾
            if (!cur->end) {
                allend = false;
            }
        }
        //cout << " ====" << endl;
        return std::pair<int, int>(true , allend);
    }
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1693906.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2024最新php项目加密源码

压缩包里有多少个php就会被加密多少个PHP、php无需安装任何插件。源码全开源 如果上传的压缩包里有子文件夹&#xff08;子文件夹里的php文件也会被加密&#xff09;&#xff0c;加密后的压缩包需要先修复一下&#xff0c;步骤&#xff1a;打开压缩包 》 工具 》 修复压缩文件…

2024-05学习笔记

最近的学习大多都是和mysql的索引相关的 1.mvcc mvcc是不需要手动配置&#xff0c;是mysql的一个机制 在事务开启时&#xff0c;对涉及到的数据加一个隐藏列&#xff0c;隐藏列对应的值&#xff0c;就是事务id 如果当前是修改操作&#xff0c;就copy一份原来的数据到新的一行…

Atlas 200 DK(Model 3000)安装MindSpore Ascend版本

一、参考资料 mindspore快速安装 二、重要说明 经过博主多次尝试多个版本&#xff0c;Atlas 200 DK&#xff08;Model 3000&#xff09;无法安装MindSpore Ascend版本。 三、准备工作 1. 测试环境 设备型号&#xff1a;Atlas 200 DK(Model: 3000) Operating System Vers…

【Go专家编程——内存管理——内存分配】

1.内存分配 1.1 基础概念 编写过C语言的读者一定指导malloc()函数用于动态申请内存&#xff0c;其中内存分配器使用glic提供的ptmalloc2。 内存分配器 c语言的ptmalloc2google的tcmallocfacebook的jemalloc后两者在避免内存碎片和性能上均比glibc有较大优势&#xff0c;在多…

VBA即用型代码手册:删除Excel中空白行Delete Blank Rows in Excel

我给VBA下的定义&#xff1a;VBA是个人小型自动化处理的有效工具。可以大大提高自己的劳动效率&#xff0c;而且可以提高数据的准确性。我这里专注VBA,将我多年的经验汇集在VBA系列九套教程中。 作为我的学员要利用我的积木编程思想&#xff0c;积木编程最重要的是积木如何搭建…

HTTP响应的基本概念

目录 HTTP响应中的一些信息 HTTPS HTTP响应中的一些信息 状态码&#xff1a;描述了这次HTTP请求是否成功&#xff0c;以及失败的原因。 1&#xff09;200 ---OK 表示这次访问成功了。 2&#xff09;404 ---Not Found 表示客户端请求的资源在服务器这边不存在。 3&a…

93.网络游戏逆向分析与漏洞攻防-游戏技能系统分析-增强技能信息显示后进行分析

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 如果看不懂、不知道现在做的什么&#xff0c;那就跟着做完看效果&#xff0c;代码看不懂是正常的&#xff0c;只要会抄就行&#xff0c;抄着抄着就能懂了 内容…

Pytorch深度学习实践笔记3

&#x1f3ac;个人简介&#xff1a;一个全栈工程师的升级之路&#xff01; &#x1f4cb;个人专栏&#xff1a;pytorch深度学习 &#x1f380;CSDN主页 发狂的小花 &#x1f304;人生秘诀&#xff1a;学习的本质就是极致重复! 视频来自【b站刘二大人】 目录 1 梯度下降&#…

html简述——part1

HTML概述 HTML&#xff08;HyperText Markup Language&#xff09;是一种用于创建网页的标准标记语言&#xff0c;具体指超文本标记语言。它不是一种编程语言&#xff0c;而是一种标记语言&#xff0c;用于描述网页的结构和内容。通过HTML&#xff0c;开发者可以定义网页的标题…

【算法】递归、搜索与回溯——简介

简介&#xff1a;递归、搜索与回溯&#xff0c;本节博客主要是简单记录一下关于“递归、搜索与回溯”的相关简单概念&#xff0c;为后续算法做铺垫。 目录 1.递归1.1递归概念2.2递归意义2.3学习递归2.4写递归代码步骤 2.搜索3.回溯与剪枝 递归、搜索、回溯的关系&#xff1a; …

广告圈策划大师课:活动策划到品牌企划的深度解析

对于刚接触营销策划的新人来说&#xff0c;在这个知识密集型行业里生存&#xff0c;要学习非常多各种意思相近的概念&#xff0c;常常让人感到头疼&#xff0c;难以区分。 这里对这些策划概念进行深入解析&#xff0c;帮助您轻松理清各自的含义和区别。 1. 活动策划&#xff…

CCF20230901——坐标变换(其一)

CCF20230901——坐标变换&#xff08;其一&#xff09; #include<bits/stdc.h> using namespace std; int main() {int n,m,x[101],y[101],x1[101],y1[101];cin>>n>>m;for(int i0;i<n;i)cin>>x1[i]>>y1[i];for(int j0;j<m;j)cin>>x[…

PD协议:引领电子设备充电新时代

随着科技的飞速发展&#xff0c;电子设备已成为我们日常生活中不可或缺的一部分。然而&#xff0c;这些设备的充电问题一直困扰着广大用户。传统的充电方式不仅效率低下&#xff0c;而且存在着安全隐患。为了解决这一问题&#xff0c;USB Implementers Forum&#xff08;USB-IF…

IPv6 地址创建 EUI-64 格式接口 ID 的过程

IPv6 接口标识符 IPv6 地址中的接口标识符&#xff08;ID&#xff09;用于识别链路上的唯一接口&#xff0c;有时被称为 IPv6 地址的 “主机部分”。接口 ID 在链路上必须是唯一的&#xff0c;始终为 64 位长&#xff0c;并且可以根据数据链路层地址动态创建。 MAC 地址 中的…

【C++项目】实时聊天的在线匹配五子棋对战游戏

目录 项目介绍 开发环境 核心技术 项目前置知识点介绍 Websocketpp 1. WebSocket基本认识 2. WebSocket协议切换原理解析 3. WebSocket报文格式 4. Websocketpp介绍 5. 搭建一个简单WebSocket服务器 JsonCpp 1. Json格式的基本认识 2. JsonCpp介绍 3. 序列化与反序…

在ubuntu中关于驱动得问题:如何将nouveau驱动程序加入黑名单和安装NVIDIA显卡驱动

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、nouveau驱动程序加入黑名单二、安装NVIDIA显卡驱动 一、nouveau驱动程序加入黑名单 (1) 打开黑名单列表文件 终端输入&#xff1a; sudo gedit /etc/modprobe…

CCF20230501——重复局面

CCF20230501——重复局面 代码如下&#xff1a; #include<bits/stdc.h> using namespace std; int main() {int n;cin>>n;char a[101][64];int i,j;for(i0;i<n;i){for(j0;j<64;j){cin>>a[i][j];}}int temp0,flag1;for(i0;i<n;i){flag1;for(j0;j<…

Linux程序开发(十二):线程与多线程同步互斥实现抢票系统

Tips&#xff1a;"分享是快乐的源泉&#x1f4a7;&#xff0c;在我的博客里&#xff0c;不仅有知识的海洋&#x1f30a;&#xff0c;还有满满的正能量加持&#x1f4aa;&#xff0c;快来和我一起分享这份快乐吧&#x1f60a;&#xff01; 喜欢我的博客的话&#xff0c;记得…

Mongodb分布式id

1、分布式id使用场景 分布式ID是指在分布式系统中用于唯一标识每个元素的数字或字符串。在分布式系统中&#xff0c;各个节点或服务可能独立运行在不同的服务器、数据中心或地理位置&#xff0c;因此需要一种机制来确保每个生成的ID都是全局唯一的&#xff0c;以避免ID冲突。 …

Pytorch线性模型(Linear Model)

基本步骤 ①首先准备好数据集&#xff08;DataSet&#xff09; ②模型的选择或者设计&#xff08;Model&#xff09; ③进行训练&#xff08;Train&#xff09;大部分模型都需要训练&#xff0c;有些不需要。这一步后我们会确定不同特征的权重 ④推理&#xff08;inferring…