HJ153 实现字通配符*

  • 题目
  • 题解(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。
cpp 复制代码
#include <iostream>
using namespace std;

#include<string>
#include<set>
#include<cstring>
#include<algorithm>
int pan=0;
set<int>w;
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(b>=np){
    w.insert(a);
return;
}
if(a>=ns){  
    
    
    return;
}
if(p[b]=='*'){
def(a,b+1);
def(a+1,b+1);
def(a+1,b);

}
if(s[a]!=p[b]){
    return;
}
if(s[a]==p[b]){
    def(a+1,b+1);

}

}



int main(){
cin>>p;
cin>>s;
ns=s.size();
 np=p.size();
for(int i=0;i<ns;i++){
    if(p.empty()||p[0]=='*'||p[0]==s[i])
    
def(i,0);
if(!w.empty()){

    pan=1;
    for(auto j: w){
        if(j>i){
cout<<i<<' '<<j-i<<endl;


}

    }
}

w.clear();
memset(vit,0,sizeof(vit));
}

if(pan==0){
    cout<<"-1 0";
}


    return 0;
}
相关推荐
91刘仁德6 小时前
传输层协议深度拆解:端口寻址、UDP 报文与 TCP 可靠性机制全解析
linux·网络·c++·网络协议·tcp/ip·udp·c
小O的算法实验室6 小时前
IEEE TEVC,学习辅助的搜索路径重构进化算法
学习·算法·重构
Liuchang09116 小时前
洛谷 P2670 [NOIP 2015 普及组] 扫雷游戏
c++·算法·游戏
言乐66 小时前
Python体现逻辑回归和决策树的区别
开发语言·python·算法·决策树·逻辑回归
顶点多余6 小时前
C/C++常见面试题
开发语言·c++
HugoStudio_SWAN6 小时前
洛谷 B4575 [GESP202609 二级] 直角三角形——临场定义理解与边界质疑
c++·学习·程序人生·算法
(Charon)6 小时前
【C++面试】右值引用与移动语义:std::move到底做了什么
开发语言·c++
红豆诗人6 小时前
C++二叉搜索树:查找、插入和删除为什么这样写
数据结构·c++·算法
HZjiangzi6 小时前
深耕精密驱动二十六载,捷昌驱动助力机器人产业升级发展
人工智能·算法
奋发向前wcx6 小时前
CSP-J复赛模拟赛3 王晨旭补题 2026.10.4
算法