Implement strStr()
Returns a pointer to the first occurrence of needle in haystack, or null if needle is not part of haystack.
Updated 201401:
Analysis:
A trie can solve the problem.(unfinished)
The code below can run without error in my computer but failed the OJ(test case: "mississippi","mississippi"), anyone can tell me what's wrong with my code???
Code(C++):
class Solution { public: struct Node{ map<char, Node*> child; char chr; char* st; Node(char c):chr(c){}; }; void buildTrie(char* str, Node* Trie, char* st){ if(str[0]=='\0'){ Trie->child['\0']=new Node('\0'); Trie->child['\0']->st = st; return; }else{ if (Trie->child.find(str[0])==Trie->child.end()){ Trie->child[str[0]]=new Node(str[0]); } buildTrie(str+1,Trie->child[str[0]],st); } } char* search(Node* root, char* needle){ if (needle[0]=='\0'){ return root->st; }else{ if (root->child.find(needle[0])==root->child.end()){ return NULL; }else{ return search(root->child[needle[0]],needle+1); } } } char *strStr(char *haystack, char *needle) { Node* Trie = new Node(' '); Node* root = Trie; char*tmp; for (int i=0;i<strlen(haystack);i++){ strcpy(tmp,haystack+i); buildTrie(tmp,Trie,haystack+i); } return search(root,needle); } };
(KMP Algorithm)Analysis:
This is a classical string problem, which can be solved using the famous KMP problem.
Relative website:
http://en.wikipedia.org/wiki/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm
Another Chinese website:
http://blog.csdn.net/lin_bei/article/details/1252686
Code(C++):
class Solution { public: void getnext(const char* p, int lp, vector<int>& next) { next[0] = -1; int i = 0; while(i < lp - 1) { int idx = i >= 0? next[i]: -1; if(-1 == idx) next[++i] = ++idx; else if(p[i] == p[idx]) next[++i] = ++idx; else { while(idx >= 0 && p[i] != p[idx]) idx = next[idx]; next[++i] = ++idx; } } } int match(char* s, char* p, int ls, int lp) { vector<int> next(lp); int i = 0; int j = 0; getnext(p, lp, next); while(i < strlen(s)) { if(-1 == j || s[i] == p[j]) { ++i; ++j; } else j = next[j]; if(j == lp) return i - lp; } return -1; } char *strStr(char *haystack, char *needle) { // Start typing your C/C++ solution below // DO NOT write int main() function int l_need = strlen(needle); if(l_need == 0) return haystack; int l_hay = strlen(haystack); if(l_hay == 0) return NULL; int idx = match(haystack, needle, l_hay, l_need); if(idx >= 0) return haystack+idx; return NULL; } };
KMP Code (Python):
class Solution: # @param haystack, a string # @param needle, a string # @return an integer def computeLps(self, needle): lps = [0] * len(needle) lon = 0 i = 1 while i < len(needle): if needle[lon] == needle[i]: lon += 1 lps[i] = lon i += 1 else: if lon == 0: lps[i] = 0 i += 1 else: lon = lps[lon-1] return lps def strStr(self, haystack, needle): if needle == "": return 0 lps = self.computeLps(needle) i = 0 j = 0 while i<len(haystack): if haystack[i] == needle[j]: i += 1 j += 1 if j == len(needle): return i-j elif i< len(haystack) and haystack[i]!=needle[j]: if j==0: i += 1 else: j = lps[j-1] return -1
/* Not Boyer/Moore Not KMP. Minimal. But for many situations reasonable. */
ReplyDeletechar *strstr(const char *s1, const char *s2) {
const char *a = s1, *b = s2;
for (;;)
if (!*b) return (char *)s1;
else if (!*a) return NULL;
else if (*a++ != *b++) {a = ++s1; b = s2;}
}