题目描述:

实现 strStr() 函数。

给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串出现的第一个位置(下标从 0 开始)。如果不存在,则返回 -1 。

说明:

当 needle 是空字符串时,我们应当返回什么值呢?这是一个在面试中很好的问题。

对于本题而言,当 needle 是空字符串时我们应当返回 0 。这与 C 语言的 strstr() 以及 Java 的 indexOf() 定义相符。

示例:

输入:haystack = "hello", needle = "ll"
输出:2
输入:haystack = "", needle = ""
输出:0
输入:haystack = "aaaaa", needle = "bba"
输出:-1

朴素模式匹配:

该题是典型的串的模式匹配问题,而数据结构中我们学到,对于串的模式匹配文题,有两种解法,分别为朴素的模式匹配和KMP模式匹配。

先讲第一种朴素模式匹配,也即暴力解法,定义两个指针i,j分别指向主串和模式串,每次比较当前两个指针指向的元素:

1)当元素相等时,i++,j++继续向后比较;

2)当元素不相等时,两指针分别回溯,i=i-j+1,j=0(注意,在这里,因为模式串需要重新一一和主串比较,所以模式串回溯到起点j=0,而为了减少比较次数,主串回溯到i-j+1即可)(课本上是ii-j+2,因为它是从下标1开始的,而C语言默认下标从0开始)

代码:

int strStr(char * haystack, char * needle){int len1=strlen(haystack);int len2=strlen(needle);if(len2==0)//当needle是空字符串时,返回0{return 0;}if(len2>len1)//needle串必须小于haystack串{return -1;}int i=0;int j=0;int pos=-1;while(i<len1 && j<len2){if(haystack[i]==needle[j]){i++;j++;}else//不匹配,主串指针i和模式串指针j分别回溯{i=i-j+1;j=0;}}if(j==len2){pos=i-len2;//匹配成功,返回needle串在主串的首位置}return pos;
}

KMP算法:

原理看这里:(27条消息) 408复习笔记——数据结构(四):串和模式匹配算法(KMP)_薪哥,很潇洒的博客-CSDN博客_408kmp代码考吗https://blog.csdn.net/qq_44161734/article/details/118252280

代码:

int strStr(char * haystack, char * needle){int len1=strlen(haystack);int len2=strlen(needle);if(len2==0)//当needle是空字符串时,返回0{return 0;}if(len2>len1)//needle串必须小于haystack串{return -1;}int *next=(int *)malloc(sizeof(int)*len2);//next数组 表示当模式串和主串不匹配时跳转位置//构建next数组next[0]=0;for(int i=1,j=0;i<len2;i++){while(j>0 && needle[i]!=needle[j]){j=next[j-1];}if(needle[i]==needle[j]){j++;}next[i]=j;}//kmp模式匹配int j=0;for(int i=0;i<len1;i++){while(j>0 && haystack[i]!=needle[j]){j=next[j-1];}if(haystack[i]==needle[j]) {j++; }if(j==len2){return i-j+1;}}return -1;}

实现strStr()相关推荐

  1. LeetCode简单题之实现 strStr()

    题目 实现 strStr() 函数. 给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串出现的第一个位置(下标从 0 开始).如果不存在 ...

  2. strchr strstr函数php,PHP字符串函数之 strstr stristr strchr strrchr

    strstr -- 查找字符串的首次出现,返回字符串从第一次出现的位置开始到该字符串的结尾或开始. stristr -- strstr 函数的忽略大小写版本 strchr -- strstr 函数的别 ...

  3. strstr函数头文件_C语言(函数)学习之strstr strcasestr

    一.strstr函数使用 [1] 函数原型 char *strstr(const char *haystack, const char *needle); [2] 头文件 #include [3] 函 ...

  4. 【力扣网练习题】实现 strStr()

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

  5. 模拟实现: strstr strcpy strlen strcat strcmp memcpy memmove

    模拟实现: strstr strcpy strlen strcat strcmp memcpy memmove ================================ 1 strstr 字符 ...

  6. 【每日一算法】实现strStr()

    微信改版,加星标不迷路! 每日一算法-实现strStr() 作者:阿广 阅读目录 ? 题目 ? 解析 ? 完整代码 1 题目 实现 strStr() 函数. 给定一个 haystack 字符串和一个 ...

  7. 实现 strStr()

    实现 strStr() 给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串出现的第一个位置(下标从 0 开始).如果不存在,则返回  - ...

  8. strstr php文档,php字符串函数学习之strstr()

    /* 定义和用法 strstr() 函数搜索一个字符串在另一个字符串中的第一次出现. 该函数返回字符串的其余部分(从匹配点).如果未找到所搜索的字符串,则返回 false. 语法 string str ...

  9. 【C语言】 strstr查找子字符串函数以及模拟实现讲解

    strstr 字符串查找函数 返回的是相同子串的第一个出现的的地址   返回类型是 char* 返回的是相同子串的第一个出现的的地址   参数是 const char* str1 ,const cha ...

  10. 从C++strStr到字符串匹配算法

    字符串的匹配先定义两个名词:模式串和文本串.我们的任务就是在文本串中找到模式串第一次出现的位置,如果找到就返回位置的下标,如果没有找到返回-1.其实这就是C++语言里面的一个函数: extern ch ...

最新文章

  1. C++11中std::bind的使用
  2. 单招计算机专业综合测试,单招计算机专业模习题.doc
  3. ubuntu linux指南 管理篇,Ubuntu Linux指南:管理篇
  4. 信息保真度准则_设计保真度的新的非科学公式
  5. CLion + OpenCV 开发
  6. 毕业设计一周一记06
  7. 期货市场技术分析02_趋势的基本概念
  8. 22. 二叉树的层次遍历
  9. Careercup - Facebook面试题 - 4907555595747328
  10. DbgView远程调试
  11. 软件定义汽车,OTA技术有多重要?
  12. 示波器探头对测量可能引起的10种影响
  13. Social Radio:像收听广播一样收听Twitter状态更新
  14. 完全免费一级域名强注册地址 免费二级域名注册地址
  15. pg_stat_database的字段tup_returned,tup_fetched含义
  16. Sap Program 自动创建供应商资料,BP
  17. 基于python开发pepper机器人的人脸识别--使用facenet
  18. mybatis超详细的笔记记录
  19. Android 上架腾讯应用宝
  20. C Shell 详解

热门文章

  1. 数据库-Oracle
  2. Linux 命令(148) —— pstack 命令
  3. 你不知道的margin:auto居中原理
  4. 什么是招聘测评工具?
  5. 【计算机视觉】关于用opencv 设置摄像头读分辨率问题的若干说明
  6. 网络同步时钟系统_NTP时间服务器
  7. 自行更换内存条的操作规范
  8. java web开发实训心得,【JavaWeb实训心得体会材料】
  9. 侯捷C++->构造函数
  10. 拖拽即可创建HTML5网站的建站平台