NC220859. 寻找字符串
描述
输入描述
第一行有两个整数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')