
题目题解(9)讨论(26)排行中等 通过率16.60% 时间限制2秒 空间限制256M知识点运维工程师字符串查找哈希PHP工程师Java工程师iOS工程师golang工程师深圳虾皮信息科技有限公司测试工程师安卓工程师前端工程师算法工程师2019C工程师校招时部分企业笔试将禁止编程题跳出页面为提前适应练习时请使用在线自测而非本地IDE。描述在 Linux Shell 中通配符 * 代表任意长度可为 00的字符串。给定∙ ∙ 一条模式串p仅包含可见字符及通配符 *无其他元字符∙ ∙ 一条目标串s仅包含除通配符 * 以外的可见字符请输出 s 中所有与 p 匹配的子串的起始位置从 00 开始计及长度。若不存在匹配输出 -1 0。多组匹配按起始位置升序长度升序排序输出。 * 可匹配空串匹配不要求整个 s只需匹配其任一连续子串。输入描述第一行模式串 p 长度不超过20第二行目标串 s 长度不超过 103103输出描述对每一个匹配子串输出 匹配起始位置 匹配的长度空格分隔一行若无匹配输出 -1 0。示例1输入shopee*.com shopeemobile.com复制输出0 16复制说明0 起始位置16长度示例2输入*.com shopeemobile.com复制输出0 16 1 15 2 14 3 13 4 12 5 11 6 10 7 9 8 8 9 7 10 6 11 5 12 4复制示例3输入o*m shopeemobile.com复制输出2 5 2 14 7 9 14 2复制备注本题已于下方时间节点更新请注意题解时效性1. 2025-12-25 原数据范围有误已修正为 103103同时重造了数据时间限制拓展为 2s空间限制拓展为 256MB。#include iostream using namespace std; #includestring #includeset #includecstring #includealgorithm int pan0; setintw; string p; string s; int ns,np; int vit[1000][20]; void def(int a,int b){ if(vit[a][b]){ return; } vit[a][b]1; if(bnp){ w.insert(a); return; } if(ans){ return; } if(p[b]*){ def(a,b1); def(a1,b1); def(a1,b); } if(s[a]!p[b]){ return; } if(s[a]p[b]){ def(a1,b1); } } int main(){ cinp; cins; nss.size(); npp.size(); for(int i0;ins;i){ if(p.empty()||p[0]*||p[0]s[i]) def(i,0); if(!w.empty()){ pan1; for(auto j: w){ if(ji){ couti j-iendl; } } } w.clear(); memset(vit,0,sizeof(vit)); } if(pan0){ cout-1 0; } return 0; }