[特殊字符] 2025蓝桥杯备赛Day8——B2118 验证子串

news/2025/3/24 17:03:28/

🔍 2025蓝桥杯备赛Day8——B2118 验证子串

🚀 题目速览

题目难度:⭐️ 适合掌握字符串基本操作

考察重点:子串判断、字符串查找、条件分支处理

B2118 验证子串

题目描述

输入两个字符串,验证其中一个串是否为另一个串的子串。

输入格式

两行,每行一个字符串。

输出格式

若第一个串 s 1 s_1 s1 是第二个串 s 2 s_2 s2 的子串,则输出(s1) is substring of (s2)

否则,若第二个串 s 2 s_2 s2 是第一个串 s 1 s_1 s1 的子串,输出(s2) is substring of (s1)

否则,输出 No substring

输入输出样例 #1

输入 #1

abc
dddncabca

输出 #1

abc is substring of dddncabca

输入输出样例 #2

输入 #2

aaa
bbb

输出 #2

No substring

说明/提示

对于 100 % 100 \% 100% 的数据,字符串长度在 20 20 20 以内。

🔥 解法一:直接查找法(推荐)

🛠️ 实现思路

核心技巧:利用 string::find 函数进行子串判断

算法优势:代码简洁,时间复杂度 O(n*m)(n和m为字符串长度)

#include <iostream>
#include <string>
using namespace std;int main() {string s1, s2;getline(cin, s1);  // 读取第一个字符串(兼容含空格输入)getline(cin, s2);  // 读取第二个字符串// 核心判断逻辑(利用string::find)if (s2.find(s1) != string::npos) {  // 判断s1是否在s2中cout << s1 << " is substring of " << s2 << endl;} else if (s1.find(s2) != string::npos) {  // 判断s2是否在s1中cout << s2 << " is substring of " << s1 << endl;} else {cout << "No substring" << endl;  // 无包含关系}return 0;
}

🔥 解法二:双检暴力匹配法

🛠️ 实现思路

核心技巧:手动实现子串匹配逻辑,加深算法理解

教学价值:理解字符串匹配底层原理

#include <iostream>
#include <string>
using namespace std;// 自定义子串判断函数(暴力匹配)
bool isSubstring(const string& mainStr, const string& subStr) {if (subStr.empty()) return true;  // 空串是任意字符串的子串if (mainStr.size() < subStr.size()) return false;  // 主串更短时直接返回// 双重循环逐字符匹配for (int i = 0; i <= mainStr.size() - subStr.size(); ++i) {  // 主串起始位置遍历bool match = true;for (int j = 0; j < subStr.size(); ++j) {  // 子串逐字符比对if (mainStr[i + j] != subStr[j]) {  // 发现不匹配字符match = false;break;  // 提前结束内层循环}}if (match) return true;  // 完全匹配时返回成功}return false;  // 遍历结束未找到匹配
}int main() {string s1, s2;getline(cin, s1);getline(cin, s2);// 分支判断逻辑if (isSubstring(s2, s1)) {  // 先判断s1是否是s2的子串cout << s1 << " is substring of " << s2 << endl;} else if (isSubstring(s1, s2)) {  // 再判断s2是否是s1的子串cout << s2 << " is substring of " << s1 << endl;} else {cout << "No substring" << endl;  // 双重判断失败}return 0;
}

📚 知识点总结

一、关键库函数

  1. string::find()

    size_t pos = s.find(sub); // 返回sub首次出现的位置
    // 返回值说明:
    // - 找到:返回合法索引(0 ≤ pos < s.size())
    // - 未找到:返回string::npos(通常为-1)
    

二、暴力匹配算法

  1. 双循环结构

    for (主串遍历) {for (子串遍历) {逐字符比对}
    }
    
  2. 时间复杂度:O(n*m)(最坏情况)

三、string::npos 深度解析

特性说明
定义static const size_t npos = -1,本质是size_t类型的最大值(64位系统为18446744073709551615
用途表示字符串查找失败(如find()未匹配到子串),或表示“直到字符串末尾”的截取操作(如substr(pos, npos)
使用规范必须与size_t类型变量比较,避免与int混用导致的逻辑错误
典型错误if (s.find("x") == -1)(错误,应写为if (s.find("x") == string::npos)

🔥 双解法对比分析

维度直接查找法(解法一)双检暴力匹配法(解法二)
时间复杂度O(1)(哈希表查询)O(nm)(暴力匹配,实际效率低)
扩展性:仅需修改哈希表键值对即可支持新规则:需修改多个条件分支,易引入逻辑错误
可读性★★★★★:规则集中可视化,逻辑清晰★★★☆☆:分支嵌套复杂时需逐行推导逻辑
内存占用约30字节(存储哈希表)0额外内存:无数据结构存储开销
抗错能力:自动处理所有合法输入,未匹配时返回npos:依赖首字母正确性,非法输入易导致错误

🚨 常见错误警示

错误1:输入顺序颠倒

// 错误:先判断s1是否在s2中,但变量顺序颠倒
if (s1.find(s2) != npos) { ... } 
// 正确顺序应保持题目要求的判断顺序

错误2:空字符串处理

// 错误:未处理空字符串导致逻辑异常
if (s2.find(s1) != npos) // 若s1为空则恒成立
// 修正:题目保证输入非空(根据样例)

错误3:输出格式错误

// 错误:变量输出顺序颠倒
cout << s2 << "..." << s1; // 与题意要求不符

🌟 举一反三

变种题1:统计子串出现次数

int count = 0;
size_t pos = 0;
while ((pos = s.find(sub, pos)) != string::npos) {++count;pos += sub.size(); // 非重叠统计
}

变种题2:大小写不敏感判断

// 将字符串统一转为小写再比较
string lower_str = str;
transform(lower_str.begin(), lower_str.end(), lower_str.begin(), ::tolower);

🛠️ 实战技巧

1. 输入优化

// 使用快速IO(关闭同步流)
ios::sync_with_stdio(false);
cin.tie(nullptr);

2. 边界测试用例

测试案例预期输出测试目的
s1=“a”, s2=“a”a is substring of a完全相同字符串
s1=“ab”, s2=“abc”ab is substring of abc前部匹配
s1=“abc”, s2=“aababc”abc is substring of aababc后部匹配
s1=“abcd”, s2=“abc”abc is substring of abcd后判断成立

蓝桥杯考场策略

  • 优先使用解法一:代码简洁,不易出错
  • 注意输出格式:严格按照题目要求的字符串顺序输出
  • 极端情况测试:测试长度相差悬殊的字符串(如s1长度20,s2长度1)

👉 思考题:若要求判断是否是连续子序列(可不连续),如何修改代码?

答案提示:需使用双指针法遍历两个字符串。


http://www.ppmy.cn/news/1581156.html

相关文章

光影香江聚四海,蓝陵科技扬帆数字内容新蓝海

3月20日&#xff0c;第29届香港国际影视展&#xff08;FILMART&#xff09;圆满收官&#xff0c;这场亚洲顶级行业盛会吸引了34个国家和地区逾760家机构参展&#xff0c;搭建起全球影视产业深度对话的桥梁。蓝陵科技携三大创新数字解决方案惊艳亮相&#xff0c;与各国行业领袖共…

如何通过Python实现自动化任务:从入门到实践

在当今快节奏的数字化时代,自动化技术正逐渐成为提高工作效率的利器。无论是处理重复性任务,还是管理复杂的工作流程,自动化都能为我们节省大量时间和精力。本文将以Python为例,带你从零开始学习如何实现自动化任务,并通过一个实际案例展示其强大功能。 一、为什么选择Pyt…

【PCIe 总线及设备入门学习专栏 3.2 -- PCIe 在进行大数据搬运时是如何组包的?】

文章目录 Overview1. PCIe数据传输的核心机制(1) 数据分割(2) TLP头部构造(3) 数据链路层封装(4) 物理层传输2. GPU从内存搬运数据的组包流程场景示例:3. 优化机制(1) 大页传输(TLP合并)(2) 流量控制与信用机制(3) 地址对齐优化4. 完整示例5. 性能影响Overview 本文将详细介…

现代美学工业风品牌海报徽标设计PSAI无衬线英文字体安装包 Moldin – Condensed Sans Serif Font

现代几何工业风品牌海报徽标设计无衬线英文字体安装包 Moldin — Condensed Sans Serif Font Moldin 是一个粗体浓缩的无衬线字体系列&#xff0c;旨在为显示和标题提供最大的影响。Moldin 有 6 种粗细可供选择&#xff0c;从常规到黑色&#xff0c;提供静态和可变格式&#x…

基于大模型的下颌前突畸形预测及治疗方案研究报告

目录 一、引言 1.1 研究背景 1.2 研究目的 1.3 研究意义 二、大模型技术原理与应用现状 2.1 大模型的基本原理 2.2 在医疗领域的应用案例 2.3 在下颌前突畸形研究中的可行性分析 三、下颌前突畸形概述 3.1 定义与分类 3.2 流行病学特征 3.3 病因与发病机制 3.4 对…

FIT Framework 社区 v3.5.0-M1 版本发布

这是 FIT Framework 社区 3.5.0 版本的第一个里程碑的发布&#xff01; FIT 函数平台 ⭐ 新特性 IoC 插件化容器能力 ● 支持 Bean 的管理&#xff0c;包括 Bean 的创建、实例化、注入等能力&#xff0c;并建立 Bean 对象之间的依赖关系。 ● 支持 Bean 的生命周期管理。 ●…

ad16以上的版本中怎么裁剪PCB板

第一步&#xff0c;绘制禁止布线层。紫色线路的外框第二步&#xff0c;长按鼠标左键拖动选中禁止布线层。 第三步&#xff0c;在设计中的板子形状中选择按照选择对象定义&#xff1b; 第四步&#xff0c;完成。

java项目40分钟后token失效问题排查(40分钟后刷新页面白屏)

项目40分钟后token失效问题排查&#xff08;40分钟后刷新页面白屏&#xff09; 经过我 对比失效前token 可以正常访问接口&#xff0c;失效后的token 不能访问系统&#xff0c; 得出结论&#xff0c;我系统对接第三方 sso 系统&#xff0c;token 失效时间 在他们那边配置&…