【算法 | 实验18】在字符矩阵中查找给定字符串的所有匹配项

news2024/9/22 0:56:57

文章目录

  • 题目描述
  • 思路分析
  • bug记录:"error: '>>' should be '> >' within a nested template argument list"
  • 代码


题目描述

题目
在字符矩阵中查找给定字符串的所有匹配项
给定一个M×N字符矩阵,以及一个字符串S,找到在矩阵中所有可能的连续字符组成的S的次数。所谓的连续字符,是指一个字符可以和位于其上下左右,左上左下,右上右下8个方向的字符组成字符串。用回溯法求解。

输入描述
输入整数t表示测试用例个数
每个测试用例,输入整数M,N,表示矩阵的行数和列数。
接下来输入M行,每行输入N列个字符
第M+1行输入一个需要在矩阵中查找的字符串S
输出描述
输出t行,每行表示第t个测试用例中矩阵中字符串出现的次数

样例输入
1
5 5
D E M X B
A O E P E
D D C O D
E B E D S
C P Y E N
CODE
样例输出
8
样例解析,有一个测试样例,给定一个5行5列字符矩阵,要查找的字符串是CODE
输出为8表示矩阵中总共包含8个"CODE",如下所示,括号内为字符对应的行和列。
‘C’(2, 2) ‘O’(1, 1) ‘D’(0, 0) ‘E’(0, 1)
‘C’(2, 2) ‘O’(1, 1) ‘D’(2, 0) ‘E’(3, 0)
‘C’(2, 2) ‘O’(1, 1) ‘D’(2, 1) ‘E’(1, 2)
‘C’(2, 2) ‘O’(1, 1) ‘D’(2, 1) ‘E’(3, 0)
‘C’(2, 2) ‘O’(1, 1) ‘D’(2, 1) ‘E’(3, 2)
‘C’(2, 2) ‘O’(2, 3) ‘D’(2, 4) ‘E’(1, 4)
‘C’(2, 2) ‘O’(2, 3) ‘D’(3, 3) ‘E’(3, 2)
‘C’(2, 2) ‘O’(2, 3) ‘D’(3, 3) ‘E’(4, 3)


思路分析

和经典的回溯法走迷宫很像,比较不同的是:
1、有 8 个行走方向
2、需要统计能匹配目标字符串的路径的数量

关于 8 个行走方向,我差点就要上 8 个if了,好在及时想到了可以使用循环。

统计路径数:设从某个位置出发,能和目标字符串 S 的剩余部分匹配的路径数为 f f f;从该位置周围的 8 个位置出发,能和目标字符串 S 的剩余部分匹配的路径数分别为 x 1 , x 2 , x 3 , x 4 , x 5 , x 6 , x 7 , x 8 x_1,x_2,x_3,x_4,x_5,x_6,x_7,x_8 x1,x2,x3,x4,x5,x6,x7,x8,则:
f = x 1 + x 2 + x 3 + x 4 + x 5 + x 6 + x 7 + x 8 f = x_1+x_2+x_3+x_4+x_5+x_6+x_7+x_8 f=x1+x2+x3+x4+x5+x6+x7+x8
例如在下图中,以中间的 C C C为当前位置,则 x 1 = 5 , x 4 = 3 x_1=5,x_4=3 x1=5,x4=3,其余 x 为 0, f = 5 + 3 = 8 f=5+3=8 f=5+3=8
在这里插入图片描述


bug记录:“error: ‘>>’ should be ‘> >’ within a nested template argument list”

中文翻译:“错误:”>>“在嵌套模板参数列表中应为”> >”

// 错误代码
vector<vector<char>>
// 修改方案:在两个尖括号中加个空格
vector<vector<char> >

原因:在使用C++11之前标准的编译器将">>“视为移位符号,导致编译错误
参考:https://blog.csdn.net/yiti8689/article/details/108134804


代码

OJ成功通过了

#include<iostream>
#include<cstdio>
#include<vector>
#include<string>
using namespace std;


//判断i, j是否在矩阵内 
bool inside(int i, int j, int m, int n){
	if(0 <= i && i < m && 0 <= j && j < n){
		return true;
	}
	return false;
}

// 回溯实现
// 参数,i,j为当前位置;len为已成功匹配的字符个数;s为目标字符串; 
int hui_su(vector<vector<char> > a, int i, int j, int m, int n, int len, string s){
	if(a[i][j] != s[len]){
		return 0;
	}
	else {
		len++;
		if(s.length() == len){
			return 1;
		}
	}
	
	//向8个方向搜索 
	int count = 0;
	for(int x = -1; x <= 1; x++){
		for(int y = -1; y <= 1; y++){
			if(x == 0 && y == 0){
				continue;
			}
			if(inside(i+x, j+y, m, n)){
				count += hui_su(a, i+x, j+y, m, n, len, s);
			}
		}
	}
	return count;
}


int main(){
	int t;  //测试用例个数
	cin >> t; 
	
	// 输入
	for(int k = 0; k < t; k++){
		int m, n;  //矩阵的大小
		string s;  //目标字符串 
		cin >> m >> n;
		vector<vector<char> > a(m, vector<char>(n));  //矩阵
		for(int i = 0; i < m; i++){
			for(int j = 0; j < n; j++){
				cin >> a[i][j];
			}
		} 
		cin >> s;

		int count = 0;
		for(int i = 0; i < m; i++){
			for(int j = 0; j < n; j++){
				count += hui_su(a, i, j, m, n, 0, s);
			}
		}
		cout << count;
	} 
	return 0;
}

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

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

相关文章

给Git仓库添加.gitignore:清理、删除、排除被Git误添加的临时文件

文章目录一、前言二、发现提交的临时文件三、去掉临时文件的方法3.1 添加.gitignore3.2 删除临时文件缓存3.3 添加后的效果一、前言 最近维护代码过程中&#xff0c;发现某APP代码库里被提交了许多临时文件&#xff0c;而这些临时文件每次都会变化&#xff0c;所以导致每次修改…

为什么要写单测

一、什么是单元测试 “在计算机编程中&#xff0c;单元测试又称为模块测试&#xff0c;是针对程序模块来进行正确性检验的测试工作。程序单元是应用的最小可测试部件。在过程化编程中&#xff0c;一个单元就是单个程序、函数、过程等&#xff1b;对于面向对象编程&#xff0c;最…

大屏经典组件:“无限滚动” 从分析到开发

&#x1f4d6;阅读本文&#xff0c;你将 理解大屏 “无限滚动组件” 的开发思路跟随作者&#xff0c;一步步完成一个高性能 “无限滚动组件” 的开发收获一份该实现的粗糙源码。 一、无限滚动&#xff1a;事件/告警 的有力帮手 1.1 为什么需要滚动列表 大屏之所以 “炫酷” …

稳压二极管稳压电路如何设计

在一些电流不大的地方&#xff0c;一般毫安级别&#xff0c;有时候我们可以利用稳压二极管去设计一个我们需要的电压。 大家可以看下稳压二极管的伏安曲线 在反向电压下&#xff0c;尽管电流在很大的范围内变化&#xff0c;而稳压二极管两端的电压却基本上稳定在击穿电压附近&a…

[附源码]java毕业设计旅游产品销售管理

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

CISCN 2022 初赛 web 复现

[CISCN 2022 初赛]ezpop 可以看到版本&#xff0c;那么直接上网找链子打 www.zip 查看路由&#xff0c;是 Index/test&#xff0c;然后 post 传参 a <?php // 保证命名空间的一致 namespace think {// Model需要是抽象类abstract class Model {// 需要用到的关键字priv…

【vue】vuex中modules的基本用法

1&#xff0c;什么时候用modules 由于使用单一状态树&#xff0c;应用的所有状态会集中到一个比较大的对象。当应用变得非常复杂时&#xff0c;store 对象就有可能变得相当臃肿。 为了解决以上问题&#xff0c;Vuex 允许我们将 store 分割成模块&#xff08;module&#xff09…

NFT交易平台开发 创建NFT数字藏品平台

为什么需要 NFT 市场&#xff1f; NFT Marketplace 允许用户购买、出售、交易、查看或创建自己的 NFT&#xff0c;就像他们需要一个市场来购买物理或数字世界中的大多数产品一样。几乎每个人都可以进入 NFT 市场&#xff0c;但要做到这一点&#xff0c;用户必须满足以下要求&a…

第3关:节点状态检查、数据查看和更新

首先&#xff0c;需要启动服务器&#xff0c;并使用zkCli.sh连接服务器&#xff0c;进入客户端命令行界面&#xff08;如第一关所述&#xff09;。 节点状态包含以下信息&#xff1a; czxid: 节点创建时的时间戳。mzxid: 节点最新一次更新发生时的时间。ctime&#xff1a; 节…

[附源码]java毕业设计篮球装备商城系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

微服务中的服务发现是什么?

作者&#xff1a;罗泽轩 摘要&#xff1a;本文通过服务发现的相关背景和 APISIX 对于服务发现的应用与实践&#xff0c;来介绍微服务中的服务发现内容。 在互联网刚开始出现的年代&#xff0c;人们要想访问某个在线服务&#xff0c;需要输入一长串的 IP 地址。IP 地址虽然不长&…

PDF怎么编辑修改文字?

PDF怎么编辑修改文字&#xff1f;PDF大家都不陌生&#xff0c;我们经常会接触到各种类型的PDF文档&#xff0c;尽管大多数人对PDF的需求仅仅是阅读&#xff0c;但是也有很多人会需要去编辑和修改PDF文件&#xff0c;那你们知道如何编辑和修改PDF文件吗&#xff1f;金闪PDF编辑器…

提取图像直方图(图像处理)

继直方图规定化后的研究 由于直方图规定化是根据两张图片的累计直方图进行图像的处理。对于这个处理过程&#xff0c;我尝试了很图像进行替换色系&#xff0c;但是没有找到一个相对合适案例&#xff0c;来体现直方图规定化这个算法的精妙之处。在多次尝试中&#xff0c;我发现…

低代码核心:代码生成还是模型解释?

2020年第一届低代码研讨会上&#xff0c; Jordi Cabot发表了一篇文章&#xff08;或者说观点&#xff09;&#xff0c;对比了低代码和模型驱动开发的关系&#xff0c;认为低代码等于模型驱动开发。但实际上&#xff0c;不少低代码系统并不是使用模型驱动的&#xff0c;而是采用…

node的express模块

express的概述: express是一个提供web服务的框架&#xff08;内置http模块&#xff09;&#xff0c;他简化了http的相关内容&#xff0c;将对应的内容封装为了特定的方法 安装: npm i express -S 导入以及代码: //导入express 是一个函数 const expressrequire(express) //cre…

做机器人开发,你一定绕不开的模块!

Allspark 机载电脑 Allspark 是阿木实验室为广大AI智能硬件开发者打造的一款微型边缘计算机。在设计之初就定义了尺寸小巧、重量轻、算力强、可靠、扩展性高的特点。Allspark机身采用铝合金新材料外壳设计&#xff0c;内置静音散热风扇&#xff0c;尺寸94mm*59mm*37mm&#xff…

[附源码]java毕业设计警院学生学习交流系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

Linux进程常见通信方式

文章目录1、管道<1>匿名管道<2> 命名管道2、共享内存3、信号量为什么要进程要进行通信呢&#xff1f; 进程间可能存在特定的协同工作的场景&#xff0c;这个时候就需要一个进程把自己的数据交付给另一个进程&#xff0c;让其进行处理。 进程通信的本质 因为进程具有…

OAuth2.o的授权码模式为什么要用code获取token?

授权码模式&#xff08;Authorization Code&#xff09;是 OAuth 功能最齐全、流程最严谨&#xff0c;也是最常用的授权模式。 假设我们要用微信账号登录网易云音乐&#xff0c;需要以下五步&#xff1a; 访问网易云音乐客户端&#xff0c;客户端跳转到微信授权页面&#xff…

神经网络初体验

文章目录前言相关概念BP神经网络具体过程正馈反向传播总结前言 本博客仅做学习笔记&#xff0c;如有侵权&#xff0c;联系后即刻更改 科普&#xff1a; 参考博客:《老饼讲解神经网络》 相关概念 神经网络 模仿人的神经网络构建出来的数学模型 是人工智能的一个主力算法 神经…