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;
    }

  

posted @ 2016-05-29 23:46  红岸的电波  阅读(660)  评论(0编辑  收藏  举报