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

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

    分析

    这就是字符串匹配算法

    算法一:


    brute forcetime complexity: O(nm)
    space complexity: O(1)
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    class Solution {
    public:
        int strStr(string haystack, string needle) {
            if(needle =="")return 0;
            int index = -1;
            int i=0, j = 0;
            for(i = 0; i < haystack.size(); i++){
                for(j = 0; j < needle.size() && i+j < haystack.size(); j++){
                    if(needle[j] != haystack[i+j]){
                        break;
                    }
                }
                if(j == needle.size())return index = i;
            }
            return index;
        }
    };
    但是该算法在最后一个case 会超时。

    算法二:

    KMP算法。
    该算法的关键点在于生成一个 部分匹配表 Partial Match Table(又叫 Failure function)
    这样在移位的时候,就不用每次都是移动一个位置,而可以跳着移动。


    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
    class Solution {
    public:
        int strStr(string haystack, string needle) {
            int m = haystack.length(), n = needle.length();
            if (!n) return 0;
            vector<int> lps = kmpProcess(needle);
            for (int i = 0, j = 0; i < m; ) {
                if (haystack[i] == needle[j]) { 
                    i++;
                    j++;
                }
                if (j == n) return i - j;
                if (i < m && haystack[i] != needle[j]) {
                    if (j) j = lps[j - 1];
                    else i++;
                }
            }
            return -1;
        }
     
        vector<int> kmpProcess(string s) {
            vector<int> b(s.size(),0);
            int j = 0;
            //下面计算b[i]
            for (int i = 1; i < s.size(); i++) {
                while (j > 0 && s[i] != s[j]) 
                    j = b[j - 1];//当前的widest border不满足要求,那么找到next widest border
                if (s[i] == s[j]) 
                    j++;
                b[i] = j;
            }
            return b;
        }
    };




  • 相关阅读:
    python+selenium+Chrome options参数
    selenium用法
    python-pytest学习(十九)-pytest分布式执行(pytest-xdist)
    python-pytest学习(十八)-运行上次失败用例(--lf和--ff)
    python-pytest学习(十七)-conftest.py作用范围
    python-pytest学习(十六)-fixture作用范围
    python-pytest学习(十六)-多个fixture和fixture直接相互调用
    python-pytest学习(十五)-fixture详解
    python-pytest学习(十四)配置文件pytest.ini
    python-pytest学习(十三)-fixture之autouse=True
  • 原文地址:https://www.cnblogs.com/zhxshseu/p/56c1b57308600b10db4c03321bd2303c.html
Copyright © 2011-2022 走看看