【2023】华为OD机试真题Java CC++ Python JS Go-题目0257-增强的strstr

本篇博客介绍了华为OD机试中的一道题目,涉及增强的strstr函数实现,允许使用可选段进行模糊查询。题目要求在源字符串中查找目标字符串并返回匹配子串的偏移位置。文章详细解析了题意,给出了复杂度分析,并提供了多种编程语言的参考解题示例。

题目0257-增强的strstr

题目描述

C 语言有一个库函数: char *strstr(const char *haystack, const char *needle) ,实现在字符串 haystack 中查找第一次出现字符串 needle 的位置,如果未找到则返回 null

现要求实现一个strstr的增强函数,可以使用带可选段的字符串来模糊查询,与strstr一样返回首次查找到的字符串位置。

可选段使用 [] 标识,表示该位置是可选段中任意一个字符即可满足匹配条件。比如 a[bc] 表示可以匹配abac

注意目标字符串中可选段可能出现多次。

输入描述

strstr函数一样,输入参数是两个字符串指针,分别是源字符串和目标字符串。

输出描述

strstr函数不同,返回的是源字符串中,匹配子字符串相对于源字符串地址的偏移(从0开始算),如果没有匹配返回-1

补充说明:源字符串中必定不包含[];目标字符串中[]必定成对出现,且不会

### 华为OD C语言 实现 增强版 `strstr` 函数 #### 题目描述 给定两个字符串 `haystack` 和 `needle` ,请在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标(下标从0开始)。如果不存在,则返回 `-1` 。此版本的 `strstr` 函数需要支持一些额外的功能,比如忽略大小写比较。 #### 思路分析 为了实现增强版的 `strstr` 函数,在标准库函数的基础上增加了对大小写的不敏感处理。通过将两个字符串都转换成相同的情况(全部转为大写或小写),可以简化对比过程[^1]。 #### 示例代码解析 下面是一个完整的解决方案,展示了如何用C语言编写这个功能: ```c #include <stdio.h> #include <string.h> #include <ctype.h> // 辅助函数:将字符转化为小写字母 char to_lower(char c){ return (isalpha(c)) ? tolower(c) : c; } // 主要逻辑:查找子串位置并考虑大小写不敏感情况 int enhanced_strstr(const char *haystack, const char *needle){ int h_len = strlen(haystack); int n_len = strlen(needle); if(n_len == 0 || !*needle){ // 如果模式为空直接返回起始索引 return 0; } for(int i=0; i<=h_len-n_len; ++i){ int j; for(j=0;j<n_len;++j){ if(to_lower(haystack[i+j]) != to_lower(needle[j])){ break; } } if(j==n_len){ return i; } } return -1; } ``` 这段程序首先定义了一个辅助方法来确保字符被统一到同一形式以便于后续操作;接着实现了核心算法——遍历主字符串的同时逐位检查是否存在与目标相等的部分序列,并且在这个过程中忽略了字母之间的大小差异。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AmosCloud2013

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值