首页 > 其他分享 >dfs-单词匹配2

dfs-单词匹配2

时间:2023-11-23 21:24:22浏览次数:29  
标签:字符 maxX maxY 匹配 charMatrix dfs 单词 visited

题目描述
在一个字符矩阵中,可把横向或竖向连续相邻的字符、按顺序组成一个单词,例如下图所示的 XE、ACX、STJIIE
给定一个字符矩阵 charMatrix 和目标单词列表 words,请计算这个字符矩阵可以组成多少个 words 中的单词,并返回这个数量:

矩阵中每个格子的字符,对于同一个单词不能重复使用;在不同的单词之间可以重复使用。
格子字符为 ? 表示通配符,可以匹配任一字母。
解答要求
时间限制:1000ms, 内存限制:256MB
输入
首行两个整数 rows 和 cols,1 <= rows, cols <= 5
随后 rows 行,每行有 cols 个字符,表示给定的字符矩阵,字符矩阵仅由大写字母或字符?组成
最后两行输入单词数量及单词列表 words,单词仅由大写字母组成,且单词不重复,1 <= words.length <= 100,1 <= words[i].length <= 8

输出
一个整数,表示字符矩阵可以组成 words 中的单词数量

样例
输入样例 1 复制

3 4
ACEI
EX?I
SSTJ
8
ACX II STJIIE XE NXE ACA ACECTJ ACETJ
输出样例 1

6
提示样例 1
ACX, II, STJIIE, XE 这四个单词可由矩阵中连续相邻格子的字符组成。
利用通配符后,单词 NXE 可由矩阵中 ?XE 组成; 同理 ACECTJ 也可组成。
但 ACA 和 ACETJ 无法组成。

输入样例 2 复制

5 5
A?JFL
J?ASD
DG?OI
G??GB
A?OFC
7
A AA AAA AAAAAAAA ADJAS ADJAJDA LDSFL
输出样例 2

6
提示样例 2
只有 LDSFL 无法组成

算法实现思路:
实现思路如下: 
 
1. 遍历单词列表中的每个单词。 
2. 对于每个单词,使用 matchWord 函数在字符矩阵中查找匹配的单词。 
3.  matchWord 函数遍历字符矩阵中的每个位置,如果当前位置的字符与单词的第一个字符相等或者为通配符 "?",则调用 dfs 函数进行深度优先搜索。 
4.  dfs 函数递归地探索字符矩阵中的上、下、左、右四个方向,查找与单词剩余部分匹配的字符。 
5. 如果找到匹配的单词,则返回 true ,否则返回 false 。 
6. 在 getNumWords 函数中,如果找到匹配的单词,则将计数器加一。 
7. 最后返回计数器的值。 
 
代码如下:
 
package main

import (
	"fmt"
)

// 待实现函数,在此函数中填入答题代码
func getNumWords(charMatrix []string, words []string) int {
	ans := 0
	maxX := len(charMatrix)
	maxY := len(charMatrix[0])
	visited := make([][]bool, maxX)
	for i := 0; i < maxX; i++ {
		visited[i] = make([]bool, maxY)
	}
	for _, word := range words {
		if matchWord(word, charMatrix, maxX, maxY, visited) {
			ans++
		}
	}
	return ans
}

func matchWord(word string, charMatrix []string, maxX, maxY int, visited [][]bool) bool {
	for x := 0; x < maxX; x++ {
		for y := 0; y < maxY; y++ {
			if charMatrix[x][y] == word[0] || charMatrix[x][y] == '?' {
				if dfs(word, x, y, charMatrix, maxX, maxY, visited) {
					return true
				}
			}
		}
	}
	return false
}

func dfs(word string, x int, y int, charMatrix []string, maxX, maxY int, visited [][]bool) bool {
	if x < 0 || x >= maxX || y < 0 || y >= maxY || visited[x][y] {
		return false
	}
	w := charMatrix[x][y]
	if w == word[0] || w == '?' {
		if len(word) == 1 {
			return true
		}
		visited[x][y] = true
		substring := word[1:]
		result := dfs(substring, x+1, y, charMatrix, maxX, maxY, visited) || dfs(substring, x-1, y, charMatrix, maxX, maxY, visited) || dfs(
			substring, x, y+1, charMatrix, maxX, maxY, visited) || dfs(substring, x, y-1, charMatrix, maxX, maxY, visited)
		visited[x][y] = false
		return result
	}
	return false
}

func main() {
	fmt.Println(getNumWords([]string{
		"ACEI",
		"EX?I",
		"SSTJ",
	}, []string{
		"ACX",
		"II",
		"STJIIE",
		"XE",
		"NXE",
		"ACA",
		"ACECTJ",
		"ACETJ",
	}))
}
 

标签:字符,maxX,maxY,匹配,charMatrix,dfs,单词,visited
From: https://www.cnblogs.com/gongxianjin/p/17852526.html

相关文章

  • 验证私钥与公钥证书是否匹配
    客户通过生成的CSR,申请了公钥证书,可以使用以下命令来验证私钥、公钥证书、CSR文件是否匹配,如果打印的哈希值是一致的,则证明匹配,否则就是不匹配。最好不要用网上的在线验证,因为私钥万一泄漏了,那可就是重大安全问题了,一定要在自己手里保护好。打印私钥opensslpkey-inprivateKey.......
  • 电脑网站支付报错“验签出错,建议检查签名字符串或私钥与应用公钥是否匹配”问题解决记
    在对接支付宝电脑网站支付的时候,遇到如下报错:“错误代码invalid-signature错误原因:验签出错,建议检查签名字符串或签名私钥与应用公钥是否匹配”。但展示的报错内容跟实际原因有所出入(在下文中有解答),这里记录下问题的解决排查过程。问题复现在对接电脑网站支付时,生成form表单......
  • 栈和括号匹配,一文搞懂
    什么是栈栈在我们日常编码中遇到的非常多,很多人对栈的接触可能仅仅局限在递归使用的栈和StackOverflowException,栈是一种后进先出的数据结构(可以想象生化金字塔的牢房和生化角斗场的狗洞)。栈(stack)是一种运算受限的线性数据结构,它具有以下特点:1.运算受限:栈限定仅在表尾......
  • dfs思想方式
    dfs深度优先搜索:一条路走到黑基本模型:Returntypedfs(参数){判断边界(返回)扩展状态dfs下一步返回}dfs+记忆返回值=记忆化搜索  classSolution{public:intminPathCost(vector<vector<int>>&grid,vector<vector<int>>&moveCost){......
  • 【流畅的Python】2.6 序列模式匹配
    2.6序列模式匹配这一小节围绕Python3.10推出的模式匹配功能展开,其实就是新增的match/case语句。因为本小节属于第二章“丰富的序列”,所以这里只介绍了关于序列的模式匹配。在其他章节还有关于模式匹配更多的内容:2.6序列模式匹配3.3使用模式匹配处理映射5.8模式匹配类实......
  • acwing 第 130 场周赛  (前缀和,dfs,对不同边的处理)
      #include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<climits>usingnamespacestd;typedeflonglongLL;constintN=5010;intn;inta[N];LLs[N];LLget(intl,intr){return......
  • [10] 正则表达式匹配
    /***@param{string}s*@param{string}p*@return{boolean}*/varisMatch=function(s,p){if(s==null||p==null)returnfalse;//极端情况s和p都是空返回falseconstsLen=s.length,pLen=p.length;constdp=newArray(sLen+1);//......
  • loj144&145 dfs序+树状数组/线段树
    https://loj.ac/p/144https://loj.ac/p/145两题非常相似,一题的权值修改是在点上的,一题的权值修改是在整棵子树上的。首先我们要了解dfs序,并记录每个节点的子树大小sz,对于一个节点,在dfs序上sz长的区间全都是他的子节点以及他自己。所以我们将一棵树映射到了一个区间上,并且可......
  • 常用英语单词1
    intelligencen智力;智能;情报 artificialintelligence人工智能 marketingintelligence市场情报 remoldtheintelligenceservices重组情报部门 aprivateintelligence-analysisfirm私人情报分析公司suppressnativeintelligence压抑天性thevalueofintelligencetes......
  • 二分图最大匹配的必须边和可行边
    以下考虑完备匹配(非完备匹配要用到网络流)给定一张二分图,其最大匹配方案不一定是唯一的。若任何一个最大匹配方案的匹配边都包括\((x,y)\),则称\((x,y)\)为二分图匹配的必须边。若\((x,y)\)至少属于一个最大匹配的方案,则称\((x,y)\)为二分图匹配的可行边以下证明假设我们已经求出......