#include<iostream>#include<string>usingnamespace std;int n, m;intsearch(const string maze[],const string& word,int x,int y){int len = word.length();int flag1 =1, flag2 =1, flag3 =1;// 检查三个方向:右、下、右下for(int i =0; i < len; i++){// 向右检查if(y + i >= m || word[i]!= maze[x][y+i]){
flag1 =0;}// 向下检查if(x + i >= n || word[i]!= maze[x+i][y]){
flag2 =0;}// 右下对角线检查if(x + i >= n || y + i >= m || word[i]!= maze[x+i][y+i]){
flag3 =0;}}return flag1 + flag2 + flag3;}intmain(){int T;
cin >> T;while(T--){
cin >> n >> m;
string maze[105];for(int i =0; i < n; i++){
cin >> maze[i];}
string word;
cin >> word;int result =0;for(int i =0; i < n; i++){for(int j =0; j < m; j++){if(word[0]== maze[i][j]){
result +=search(maze, word, i, j);}}}
cout << result << endl;}return0;}
importjava.util.*;publicclassMain{staticint n, m;staticintsearch(String[] maze,String word,int x,int y){int len = word.length();int flag1 =1, flag2 =1, flag3 =1;for(int i =0; i < len; i++){// 向右检查if(y + i >= m || word.charAt(i)!= maze[x].charAt(y+i)){
flag1 =0;}// 向下检查if(x + i >= n || word.charAt(i)!= maze[x+i].charAt(y)){
flag2 =0;}// 右下对角线检查if(x + i >= n || y + i >= m || word.charAt(i)!= maze[x+i].charAt(y+i)){
flag3 =0;}}return flag1 + flag2 + flag3;}publicstaticvoidmain(String[] args){Scanner sc =newScanner(System.in);intT= sc.nextInt();while(T-->0){
n = sc.nextInt();
m = sc.nextInt();String[] maze =newString[105];for(int i =0; i < n; i++){
maze[i]= sc.next();}String word = sc.next();int result =0;for(int i =0; i < n; i++){for(int j =0; j < m; j++){if(word.charAt(0)== maze[i].charAt(j)){
result +=search(maze, word, i, j);}}}System.out.println(result);}}}
defsearch(maze, word, x, y, n, m):
length =len(word)
flag1 = flag2 = flag3 =1for i inrange(length):# 向右检查if y + i >= m or word[i]!= maze[x][y+i]:
flag1 =0# 向下检查if x + i >= n or word[i]!= maze[x+i][y]:
flag2 =0# 右下对角线检查if x + i >= n or y + i >= m or word[i]!= maze[x+i][y+i]:
flag3 =0return flag1 + flag2 + flag3
T =int(input())for _ inrange(T):
n, m =map(int,input().split())
maze =[input()for _ inrange(n)]
word =input()
result =0for i inrange(n):for j inrange(m):if word[0]== maze[i][j]:
result += search(maze, word, i, j, n, m)print(result)
算法及复杂度
算法:矩阵遍历 + 字符串匹配
时间复杂度:
O
(
T
⋅
n
⋅
m
⋅
L
)
\mathcal{O}(T \cdot n \cdot m \cdot L)
O(T⋅n⋅m⋅L) -
T
T
T 为测试用例数,
n
n
n 和
m
m
m 为矩阵维度,
L
L
L 为单词长度
空间复杂度:
O
(
n
⋅
m
)
\mathcal{O}(n \cdot m)
O(n⋅m) - 需要存储字符矩阵