24
04/2015
[LeetCode] Implement strStr()
Implement strStr()
Implement strStr().
Returns the index of the first occurrence of needle in haystack, or -1 if needle is not part of haystack.
解题思路:
1、暴力法。逐一匹配,然后回溯。代码如下,但是产生超时错误。
class Solution { public: int strStr(string haystack, string needle) { int len1=haystack.length(); int len2=needle.length(); if(len2>len1){ return -1; } for(int i=0; i<len1; i++){ int j=0; for(; j<len2&&i+j<len1; j++){ if(haystack[i+j]!=needle[j]){ break; } } if(j==len2){ return i; } } return -1; } };
2、KMP算法。
class Solution { public: int strStr(string haystack, string needle) { int len1=haystack.length(); int len2=needle.length(); if(len2>len1){ return -1; } if(len2==0){ return 0; } int next[len2]; next[0]=-1; int i=0, j=-1; while(i<len2){ if(j==-1||needle[j]==needle[i]){ i++; j++; next[i]=j; }else{ j=next[j]; } } i=0; j=0; while(i<len1){ if(j==-1||haystack[i]==needle[j]){ i++; j++; }else{ j=next[j]; } if(j==len2){ return i-len2; } } return -1; } };
二次刷题(update in 2015-07-31)
1、同样的暴力法,这次竟然很快的过了,看来编码规范还是非常重要的:
class Solution { public: int strStr(string haystack, string needle) { int m = haystack.length(); int n = needle.length(); if(m<n){ return -1; } for(int i=0; i < m - n + 1; i++){ int j = 0; while(j<n){ if(haystack[i+j]==needle[j]){ j++; }else{ break; } } if(j==n){ return i; } } return -1; } };
KMP算法老是不懂,next数组的求法需要着重记一下。参考博客:http://blog.csdn.net/v_july_v/article/details/7041827
class Solution { public: int strStr(string haystack, string needle) { int m = haystack.length(); int n = needle.length(); if(m<n){ return -1; } if(n==0){ return 0; } int next[n]; next[0] = -1; int i = 0, j = -1; while(i<n-1){ // needle[j] 与 needle[i] 分别是前缀和后缀字符串的最后一个字符 if(j==-1 || needle[j] == needle[i]){ j++; i++; next[i]=j; }else{ j = next[j]; } } i = 0, j = 0; while(i<m && j<n){ if(j == -1 || haystack[i] == needle[j]){ i++; j++; }else{ j = next[j]; } } if(j==n){ return i - j; }else{ return -1; } } };
转载请注明:康瑞部落 » [LeetCode] Implement strStr()
0 条评论