zoukankan      html  css  js  c++  java
  • Leetcode 28. Implement strStr()

    28. Implement strStr()

    • Total Accepted: 125882
    • Total Submissions: 484537
    • Difficulty: Easy

    Implement strStr().

    Returns the index of the first occurrence of needle in haystack, or -1 if needle is not part of haystack.

    思路:最朴素的想法就是2个指针的做法。还有直接可以用KMP算法做。具体可以看下面的链接:
    1. http://jakeboxer.com/blog/2009/12/13/the-knuth-morris-pratt-algorithm-in-my-own-words/

    2. http://www.geeksforgeeks.org/searching-for-patterns-set-2-kmp-algorithm/

    关于KMP,其实比较重要的就是“部分匹配表”lps。lps[i]表示的是以i位置为结尾,以0位置为开始的字符串中,前缀和后缀相同时的最大长度。也可以理解为母串Str[i,i+1,...,i+j]和子串str[0,...,j]匹配冲突(Str[i,i+1,...,i+j-1]和子串str[0,...,j-1]匹配成功)时,子串的j指针应该回到lps[j - 1]的位置成为str[j],重新与Str[i+j]进行比较。这里lps[j]可以理解为以j结束的字符串中,前缀和后缀匹配时,前缀最后一个元素的下一个位置。

    代码:

    朴素的做法:

     1 class Solution {
     2 public:
     3     int strStr(string haystack, string needle) {
     4         int j, end = haystack.size() - needle.size() + 1;
     5         for (int i = 0; i < end; i++) {
     6             for (j = 0; j < needle.size() && haystack[i+j] == needle[j]; j++);
     7             if (j == needle.size()) return i;
     8         }
     9         return -1;
    10     }
    11 };

    KMP的做法:

     1 class Solution {
     2 public:
     3     int strStr(string haystack, string needle) {
     4         vector<int> lps = KMP(needle);
     5         int i, j;
     6         for (i = 0, j =0; i < haystack.size() && j < needle.size(); ) {
     7             if (haystack[i] == needle[j]) {
     8                 i++;
     9                 j++;
    10             }
    11             else{
    12                 if (!j) i++;
    13                 else j = lps[j-1];
    14             }
    15         }
    16         return j == needle.size() ? i - j : -1;
    17     }
    18 private:
    19     vector<int> KMP(string needle){
    20         vector<int> lps(needle.size(),0);//lps[i]存储的是与i位置相同的j(i>j)位置的后一个元素的位置
    21         int len = 0;
    22         for (int i = 1;i < needle.size();) {
    23             if (needle[i] == needle[len]) lps[i++] = ++len;
    24             else {
    25                 if (!len)lps[i++] = 0;
    26                 else len = lps[len - 1];
    27             }
    28         }
    29         return lps;
    30     }
    31 };
  • 相关阅读:
    python从入门到实践-5章if语句
    HiveQL:文件格式和压缩方法
    HiveQL:调优
    HiveQL:模式设计
    HiveQL:视图
    (转)配置文件.bash_profile和.bashrc的区别
    Hive-学习总结(二)
    Hive-学习总结
    MYSQL-表类型(存储引擎)的选择
    MYSQL-常用函数
  • 原文地址:https://www.cnblogs.com/Deribs4/p/5851307.html
Copyright © 2011-2022 走看看