字符串匹配 三秒内找出唐可可

P1058: 三秒内找出唐可可


题目描述

给出唐可可的字符画,你需要在3秒内找出她在另一幅字符画中出现的地方。
要求逐字符严格匹配。

输入

第一行空格隔开n和m表示唐可可的字符画有n行m列。

接下来是n行每行m个字符给出唐可可字符画。

接着一行空格隔开u和v表示另一幅字符画有u行v列。

接下来是u行每行v个字符给出另一幅字符画。

输出

一行空格隔开的a和b,表示另一幅字符画中出现的唐可可的左上角坐标即第a行b列处,注意两者都从1开始计算。

如果存在多个这样的a和b,你得输出首先a最小,其次b最小的答案。输入保证一定存在至少一组这样的解。

样例输入复制
3 3
@@@
QWQ
\_/
9 9
@@@@@@@@@
QMQOWOQvQ
\_/\_/\_/
@@@@@@@@@
QwQQWQQxQ
\_/\_/\_/
@@@@@@@@@
OxooxOQWQ
\_/\_/\_/
样例输出复制
4 4
提示

1≤n,m≤50

1≤u,v≤100

输入可能含有空格字符,建议使用按行读入类输入处理函数。

总结:

其实此题完全没有必要用二维char数组取存字符,然后一个一个比较,

利用string类型的substr,可以实现字符串指定长度的对比

还有一个要注意的地方,唐可可的字符串可能出现在任何一个位置,

所以不要每一次for循环后调整pos的参数 +n +m,因为这并不一定

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string>
#include <vector>
using namespace std;
int n,m;
void solve(){
    string str;
    vector<string> s(n);
    getline(cin, str); //先吃回车
    for(int i = 0; i < n; ++i){
        getline(cin, str); //其实没有必要用二维char数组,比较的时候按照行数来就行
        s[i] = str;
    }
    int u, v;
    cin >> u >> v;
    vector<string> t(u);
    getline(cin, str); //先吃回车
    for(int i = 0; i < u; ++i){
        getline(cin, str);
        t[i] = str;
    }

    for(int k = 0; k <= u-n; ++k){//函数要保留n行
        for(int j = 0; j <= v-m; ++j){//列数要保留m行
            bool flag = true; //flag得放在需要用到的for循环的上一层
            for(int i = 0; i < n; ++i){ //一共要遍历n行
                //因为长度是固定的数m
                if(t[i+k].substr(j, m) != s[i]){
                    flag = false;
                    break;
                }
            }
            if(flag) {
                cout << k+1 << " " << j+1 << "\n"; //因为行数列数都是从1开始
                return;
            }
        }
    }
}
int main(){
    cin >> n >> m;
    solve();
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值