实现 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() 定义相符。
解法1:BF(暴力)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| class Solution { public: int strStr(string haystack, string needle) { int i; int k=0; if(needle.length()==0) return 0; if(haystack.length()<needle.length()) return -1; for(i=0;i<=haystack.length()-needle.length();i++) { k=0; if(haystack[i]==needle[0]) { for(int j=0;j<needle.length();j++) { if(haystack[i+j]!=needle[j]) { k=1; break; } } if(k==0) return i; } } return -1; } };
|
时间复杂度:O(M*N)
解法2:KMP
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
| class Solution { public: int strStr(string haystack, string needle) { int i=0,j=0; int hn=haystack.length(),nn=needle.length(); if(nn==0) return 0; vector<int> next(nn); next[0]=-1; int k=-1; while(j<nn-1) { if(k==-1||needle[k]==needle[j]) { k++; j++; next[j]=k; } else { k=next[k]; } } j=0; while(i<hn&&j<nn) { if(j==-1||haystack[i]==needle[j]) { i++; j++; } else { j=next[j]; } } if(j==nn) return i-j; return -1; } };
|
时间复杂度:O(N+M)
解法3:KMP(优化next数组)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
| class Solution { public: int strStr(string haystack, string needle) { int i=0,j=0; int hn=haystack.length(),nn=needle.length(); if(nn==0) return 0; vector<int> next(nn); next[0]=-1; int k=-1; while(j<nn-1) { if(k==-1||needle[k]==needle[j]) { k++; j++; if(needle[k]!=needle[j]) next[j]=k; else { next[j]=next[k]; } } else { k=next[k]; } } j=0; while(i<hn&&j<nn) { if(j==-1||haystack[i]==needle[j]) { i++; j++; } else { j=next[j]; } } if(j==nn) return i-j; return -1; } };
|
解法4:BM
解法5:Sunday