列表

详情


NC220859. 寻找字符串

描述

在遥远的海边有一个城镇,它的形状是一个 m*n 的矩阵,在每一个行列相交的点上有一个房子。有一天小王放学后,在回家的路上,他发现每一个房子门牌上都有一个字母,恰好他在今天的英语课上学了不少单词,他想知道是否存在连续的门牌号使得这些字母恰好构成这个单词,但他并不会解决这个问题,所以能请聪明的你帮帮他吗?(斜方向,或直线方向的连续存在一种符合要求的情况即可,且该过程到达边界终止)。

输入描述

第一行有两个整数m,n,表示存在m行n列的字符。
接下的m行,每行n列字符。
下一行有一个整数q,表示询问的数量。
接下来的q行,每行一个字符串s,表示一个单词。
1 <= n,m <= 100
1 <= q <= 10
1 <= s.length <= 20

输出描述

对于每一个询问,输出一个"YES"表示存在,或者"NO"表示不存在。

示例1

输入:

3 4
asdw
frzx
fesd
4
asdw
frd
zds
sra

输出:

YES
YES
NO
YES

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++(clang++11) 解法, 执行用时: 4ms, 内存消耗: 408K, 提交时间: 2021-04-10 14:41:32

#include<bits/stdc++.h>
using namespace std;
int n,m,q,fx[8][2]={{0,1},{0,-1},{1,0},{-1,0},{1,1},{-1,-1},{1,-1},{-1,1}};
char s[105][105],s1[20];
bool bo;
bool pd(int x,int y,int k,int l)
{
	for (int i=1;i<=l;i++)
	{
		if (x<=0 || x>n || y<=0 || y>m) return 0;
		if (s[x][y]!=s1[i]) return 0;
		x+=fx[k][0],y+=fx[k][1];
	}
	return 1;
}
int main()
{
	scanf("%d%d",&n,&m);
	for (int i=1;i<=n;i++) scanf("%s",s[i]+1);
	scanf("%d",&q);
	while (q--)
	{
		scanf("%s",s1+1);
		int l=strlen(s1+1);
		bo=0;
		for (int i=1;i<=n;i++)
		{
			if (bo) break;
			for (int j=1;j<=m;j++)
			{
				if (bo) break;
				for (int k=0;k<8;k++)
				if (pd(i,j,k,l))
				{
					bo=1;
					break;
				}
			}
		}
		if (bo) printf("YES\n"); else printf("NO\n");
	}
	return 0;
}

Python3(3.9) 解法, 执行用时: 34ms, 内存消耗: 6884K, 提交时间: 2021-04-10 15:03:58

n,m=map(int,input().split())
s=[input() for i in range(n)]
a=s.copy()
for i in range(m):
    a.append(''.join([s[j][i] for j in range(n)]))

for i in range(-m+1,n):
    a.append(''.join([s[i+j][j]for j in range(m) if (0<=i+j<n)]))

for i in range(0,n+m-1):
    a.append(''.join([s[i-j][j]for j in range(m) if (0<=i-j<n)]))

def query(ss):
    for it in a:
        if ss in it:
            return True
    return False
q=int(input())
for i in range(q):
    ss=input()
    vv=''.join(reversed(ss))
    print('YES' if query(ss) or query(vv) else 'NO')

上一题