字符矩阵中查找单词-python
时间:2022-08-05
本文章向大家介绍字符矩阵中查找单词-python,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
问题:给你一个字符矩阵和单词列表,输出字符矩阵能够组合成列表中的哪些词
dfs回溯算法+剪枝
# 字符矩阵+字典 -> 矩阵和字典中同时存在的词 dic = ["doaf", "agai", "dcan"] dic = [['d', 'o', 'a', 'f'], ['a', 'g', 'a', 'i'], ['d', 'c', 'a', 'n']] data = ["dog", "dad", "dgdg", "can", "again"] DIRECTIONS = [(0,1), (1,0), (0,-1), (-1,0)] def find_words(words, grid): if not words or not grid: return [] words_set = set(words) prefix_set = set() # 构建候选字符,作为剪枝使用,提高效率 result = [] for w in words_set: for i in range(len(w)): prefix_set.add(w[:i+1]) print(f"prefix set:{prefix_set}") for i in range(len(grid)): # 遍历每一个点,矩阵中的每一个点出发都是一种路径 for j in range(len(grid[0])): dfs(grid, i, j, grid[i][j], set([(i,j)]), words_set, prefix_set, result) return result # 递归的定义:递归递查找满足dict中的word def dfs(grid, x, y, word, visited, words_set, prefix_set, result): # 先剪枝,条件不满足,递归终止 if word not in prefix_set: return # 条件满足,结果追加;不用终止,后面可能还有更长符合要求的word if word in words_set: result.append(word) # 上下左右更新节点,进入更深递归 for delta_x, delta_y in DIRECTIONS: new_x = x + delta_x new_y = y + delta_y # 不满足条件直接中断,继续寻找下一个 if not is_valid(new_x, new_y, visited, grid): continue visited.add((new_x, new_y)) # word+grid[new_x][new_y] 重新开辟内存,不能破坏原来的word数据。 word += grid[new_x][new_y] 不可取 dfs(grid, new_x, new_y, word+grid[new_x][new_y], visited, words_set, prefix_set, result) visited.remove((new_x, new_y)) def is_valid(x, y, visited, grid): # 已访问,不取 if (x, y) in visited: return False # 下标越界,不取 if not (0<=x<len(grid) and 0<=y<len(grid[0])): return False return True find_words(data, dic)
原文地址:https://www.cnblogs.com/demo-deng/p/16555662.html
- Struts2再曝S2-020补丁绕过漏洞 – 万恶的正则表达式
- 学习BlogEngine.Net解读笔记系列(一)
- Android面试系列之应用内多语言切换
- Android面试系列之AsyncTask
- Kali-Linux扩充弹药:Kali Linux metapackages
- 使用HackRF解调TDD-LTE信号
- 一个优秀的Android应用从建项目开始
- Ruby OpenSSL 私钥伪造脚本
- 基于 k8s 的 Jenkins 构建集群实践
- Visual C#.Net网络程序开发-Tcp篇(1) 祥细内容:
- 无服务器化的微服务持续交付
- Visual C#.Net网络程序开发-Tcp篇(2) 祥细内容:
- 看你是否够老 – ipman的vxd程序介绍的翻译
- Visual C#.Net网络程序开发-Tcp篇(3) 祥细内容:
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- LeetCode 203 & 237. Delete Node in a Linked List
- 聊聊storm的LinearDRPCTopologyBuilder
- 贝叶斯优化(Bayesian Optimization)深入理解
- 使用filebeat收集ES集群运行日志和慢日志并写入到ES
- 类方法和实例方法
- 单链表 C++
- 为什么数组下标是从0开始?
- python pdf 转 image
- 聊聊storm的IWaitStrategy
- Kubelet PLEG源码分析
- 如何部署 VNC 远程桌面
- TiDB 源码阅读系列文章(二十)Table Partition
- 如何做到精准性能测试——WeTest助手
- 腾讯内部干货分享——JMeter中3种参数值的传递
- http性能测试点滴