【算法 | 实验18】在字符矩阵中查找给定字符串的所有匹配项
创始人
2024-01-28 18:46:48
0

文章目录

  • 题目描述
  • 思路分析
  • 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 的剩余部分匹配的路径数为 fff;从该位置周围的 8 个位置出发,能和目标字符串 S 的剩余部分匹配的路径数分别为 x1,x2,x3,x4,x5,x6,x7,x8x_1,x_2,x_3,x_4,x_5,x_6,x_7,x_8x1​,x2​,x3​,x4​,x5​,x6​,x7​,x8​,则:
f=x1+x2+x3+x4+x5+x6+x7+x8f = x_1+x_2+x_3+x_4+x_5+x_6+x_7+x_8f=x1​+x2​+x3​+x4​+x5​+x6​+x7​+x8​
例如在下图中,以中间的CCC为当前位置,则x1=5,x4=3x_1=5,x_4=3x1​=5,x4​=3,其余 x 为 0,f=5+3=8f=5+3=8f=5+3=8。
在这里插入图片描述


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

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

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

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


代码

OJ成功通过了

#include
#include
#include
#include
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 > 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 > a(m, vector(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;
}

相关内容

热门资讯

厦门生育险报销标准2022,生...   生育保险是国家提供的一项政策,对很多女性来说还是比较重要的,毕竟与我们生活紧紧联系着。每个城市的...
全国十大代驾公司排名,代驾平台...   目前代驾的平台是非常多的,我们也听说过滴滴代驾、顺风车代驾、e代驾等等代驾平台,可能更多的人比较...
美团骑手一个月1000单多少钱...   现在外卖是生活中必不可少的,当然也离不开骑手,很多人都会骑手这个职业好奇,骑手一天能赚多少钱呢?...
医保个人账户余额为0是什么意思...   医保卡对我们每个人开说,都是非常重要的,大家谁也不能确保自己一定不会生病或者有什么小毛病的,那么...
社保显示欠费是怎么回事,欠费多...   社保大家在应该对于社保缴费不陌生的,每个月的工资都是有一部分是来缴纳社保的。这也是为自己积攒社保...
医保怎么查询网上缴费,医保网上...   以前可能大家在缴纳自己的社保费用的时候,过程比较复杂,很麻烦,有时候很浪费自己的时间。不过随着网...
2022黑龙江退休工资上涨的最...   养老政策实施,是国家对基础民生的一个建设,也是提现国家对人们的关心,也是对民心的起到抚慰作用。养...
无锡公积金贷款利率最新政策,公...   公积金想着大家应该都有缴纳,只要是在公司上班的,基本上公司都会进行缴纳的。公积金的用途还是蛮大的...
美团配送费怎么算?美团配送收费...   美团外卖是生活中很流行的形式,现在的人都喜欢点外卖,也就成就了外卖员这份职业,在路上也经常会碰到...
美团优质评价50字怎么写?美团...   在平时生活中点外卖是很多人的选择,这样方便省时又省力。也有很多商家为了提高店铺的权重,都会让消费...