LintCode_13 字符串查找
题目
对于一个给定的 source 字符串和一个 target 字符串,你应该在 source 字符串中找出 target 字符串出现的第一个位置(从0开始)。如果不存在,则返回 -1
。
说明
在面试中我是否需要实现KMP算法?
- 不需要,当这种问题出现在面试中时,面试官很可能只是想要测试一下你的基础应用能力。当然你需要先跟面试官确认清楚要怎么实现这个题。
样例
如果 source = "source"
和 target = "target"
,返回 -1
。
如果 source = "abcdabcdefg"
和 target = "bcd"
,返回 1
。
挑战
O(n2)的算法是可以接受的。如果你能用O(n)的算法做出来那更加好。(提示:KMP)
思路
KMP算法 具体思路找百度很清楚
还有一种算法 BM算法实际中比KMP算法效率高很多
void getNext(const char *target, int next[]) { int len = strlen(target); next[0] = -1; int k = -1; int j = 0; while(j < len - 1) { if(k == -1 || target[j] == target[k]) { j++; k++; next[j] = k; } else { k = next[k]; } } } int strStr(const char *source, const char *target) { // write your code here if(source == NULL || target == NULL) return -1; int len_soc = strlen(source); int len_tag = strlen(target); if(!len_tag) return 0; int *next = new int[len_tag]; getNext(target, next); int ans = -1; int i = 0; int j = 0; while(i < len_soc) { if(j == -1 || source[i] == target[j]) { ++i; ++j; } else j = next[j]; if(j == len_tag) { ans = i - len_tag; break; } } return ans; }