leetcode--Implement strStr()
2015-07-31 10:49
330 查看
题目:在字符串haystack中找needle第一次出现的地方。
方法一:O(nm) runtime, O(1) space – Brute force:
暴力解法,第一次自己写的程序没有通过
用next数组记录前缀和后缀相等的个数,next[k]表示k字符前的个数
方法一:O(nm) runtime, O(1) space – Brute force:
暴力解法,第一次自己写的程序没有通过
int strStr(char* haystack, char* needle) { int i = 0; int j = 0; int slen = strlen(haystack); int plen = strlen(needle); for(i=0;;i++){ for(j=0;;j++){ if(j==plen){ return i; } if(i+j==slen){//写成i+j>slen 超时了 return -1; } if(haystack[i+j]!=needle[j]){ break; } } } }方法二:KMP算法,具体的原理还是不能完全掌握,用O(n)的时间和空间换取得到总的复杂度为O(m+n)
用next数组记录前缀和后缀相等的个数,next[k]表示k字符前的个数
void GetNext(char* p,int next[]) { int pLen = strlen(p); next[0] = -1; int k = -1; int j = 0; while (j < pLen - 1) { //p[k]表示前缀,p[j]表示后缀 if (k == -1 || p[j] == p[k]) { ++k; ++j; next[j] = k; } else { k = next[k]; } } } int strStr(char* haystack, char* needle) { int i = 0; int j = 0; int sLen = strlen(haystack); int pLen = strlen(needle); int *next=(int *)malloc(pLen*sizeof(int)); GetNext(needle,next); while (i < sLen && j < pLen) { //①如果j = -1,或者当前字符匹配成功(即S[i] == P[j]),都令i++,j++ if (j == -1 || haystack[i] == needle[j]) { i++; j++; } else { //②如果j != -1,且当前字符匹配失败(即S[i] != P[j]),则令 i 不变,j = next[j] //next[j]即为j所对应的next值 j = next[j]; } } if (j == pLen) return i - j; else return -1; }
相关文章推荐
- mysql 造1亿条记录的单表--大数据表
- 轻松实现localStorage本地存储
- hibernate manytoone中的lazy EAGER
- iOS开发---转换坐标系
- (easy)LeetCode 226.Invert Binary Tree
- hdu 1754
- 毕业季,扣丁学堂送福利啦
- Android Activity对话框(窗口)样式设置
- 深入探讨Java内存区域
- Mongodb安装搭建Replica Set+Sharding集群
- C语言试题
- 面试题36_数组中的逆序对
- Qt以及Qt Designer怎样加入资源文件
- 代码优化
- Jar mismatch! Fix your dependencies
- 学习android编程之路(4)— 实现监听事件的4种方法
- Linux用户模式和内核模式
- leetcode 072 —— Edit Distance
- Unity3d UI渐隐渐显
- Task '' not found in root project '***'.