算法--实现 strStr()

描述

实现 strStr() 函数。
给定一个 haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始)。如果不存在,则返回 -1。

示例

示例 1: 输入: haystack = “hello”, needle = “ll”
输出: 2

示例 2: 输入: haystack = “aaaaa”, needle = “bba”
输出: -1
说明:
当 needle 是空字符串时,我们应当返回什么值呢?这是一个在面试中很好的问题。
对于本题而言,当 needle 是空字符串时我们应当返回 0 。这与C语言的 strstr() 以及 Java的 indexOf() 定义相符。

分析

最直接的方法 - 沿着字符换逐步移动滑动窗口,将窗口内的子串与 needle 字符串比较。
在这里插入图片描述

实现

public int strStr(String haystack, String needle) {
        int l1=haystack.length();
        int l2=needle.length();
        if(l1<l2) {
            return -1;
        }else if(l2==0) {
            return 0;
        }
        int threshold=l1-l2;
        for(int i=0; i<=threshold;i++) {
            if(haystack.substring(i,i+l2).equals(needle)) {
                return i;
            }
        }
        return -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
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值