实现strStr()
题目描述:
实现 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()相关推荐
- LeetCode简单题之实现 strStr()
题目 实现 strStr() 函数. 给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串出现的第一个位置(下标从 0 开始).如果不存在 ...
- strchr strstr函数php,PHP字符串函数之 strstr stristr strchr strrchr
strstr -- 查找字符串的首次出现,返回字符串从第一次出现的位置开始到该字符串的结尾或开始. stristr -- strstr 函数的忽略大小写版本 strchr -- strstr 函数的别 ...
- strstr函数头文件_C语言(函数)学习之strstr strcasestr
一.strstr函数使用 [1] 函数原型 char *strstr(const char *haystack, const char *needle); [2] 头文件 #include [3] 函 ...
- 【力扣网练习题】实现 strStr()
实现 strStr() 函数. 给定一个 haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始).如果不存在,则返 ...
- 模拟实现: strstr strcpy strlen strcat strcmp memcpy memmove
模拟实现: strstr strcpy strlen strcat strcmp memcpy memmove ================================ 1 strstr 字符 ...
- 【每日一算法】实现strStr()
微信改版,加星标不迷路! 每日一算法-实现strStr() 作者:阿广 阅读目录 ? 题目 ? 解析 ? 完整代码 1 题目 实现 strStr() 函数. 给定一个 haystack 字符串和一个 ...
- 实现 strStr()
实现 strStr() 给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串出现的第一个位置(下标从 0 开始).如果不存在,则返回 - ...
- strstr php文档,php字符串函数学习之strstr()
/* 定义和用法 strstr() 函数搜索一个字符串在另一个字符串中的第一次出现. 该函数返回字符串的其余部分(从匹配点).如果未找到所搜索的字符串,则返回 false. 语法 string str ...
- 【C语言】 strstr查找子字符串函数以及模拟实现讲解
strstr 字符串查找函数 返回的是相同子串的第一个出现的的地址 返回类型是 char* 返回的是相同子串的第一个出现的的地址 参数是 const char* str1 ,const cha ...
- 从C++strStr到字符串匹配算法
字符串的匹配先定义两个名词:模式串和文本串.我们的任务就是在文本串中找到模式串第一次出现的位置,如果找到就返回位置的下标,如果没有找到返回-1.其实这就是C++语言里面的一个函数: extern ch ...
最新文章
- C++11中std::bind的使用
- 单招计算机专业综合测试,单招计算机专业模习题.doc
- ubuntu linux指南 管理篇,Ubuntu Linux指南:管理篇
- 信息保真度准则_设计保真度的新的非科学公式
- CLion + OpenCV 开发
- 毕业设计一周一记06
- 期货市场技术分析02_趋势的基本概念
- 22. 二叉树的层次遍历
- Careercup - Facebook面试题 - 4907555595747328
- DbgView远程调试
- 软件定义汽车,OTA技术有多重要?
- 示波器探头对测量可能引起的10种影响
- Social Radio:像收听广播一样收听Twitter状态更新
- 完全免费一级域名强注册地址 免费二级域名注册地址
- pg_stat_database的字段tup_returned,tup_fetched含义
- Sap Program 自动创建供应商资料,BP
- 基于python开发pepper机器人的人脸识别--使用facenet
- mybatis超详细的笔记记录
- Android 上架腾讯应用宝
- C Shell 详解