[タイトル]毎日LeetCode 0028.文字列マッチング


オープンソース住所:https://github.com/jiauzhang/algorithms


タイトル説明

*  https://leetcode-cn.com/problems/implement-strstr
*   给定一个 haystack 字符串和一个 needle 字符串,
*   在 haystack 字符串中找出 needle 字符串出现的第一个位置(从0开始)。
*   如果不存在,则返回  -1。
* 
* 示例 1:
*     输入: haystack = "hello", needle = "ll"
*     输出: 2
* 
* 示例 2:
*     输入: haystack = "aaaaa", needle = "bba"
*     输出: -1
* 
* 说明:
*     当 needle 是空字符串时,我们应当返回 1.

問題解決のためのアイデア

  1. 最も簡単な方法は、ここで説明されていない、暴力を一致させることです
  2. 古典的な溶液は、KMPアルゴリズムのコアは、KMPマッチングアルゴリズムである
    次の配列生成、最大共通の接頭辞と接尾辞を計算することで
    、実際にテンプレート文字列の指標である変化配列を理解する考え方は、
    同じ最大サブテンプレートを有しますあなたが存在しないものをスキップすることができます
    かを決定することなく、同じテンプレートをサブストリングを、テンプレートは、移行のスピードを加速する
    方法をマッチングとして暴力を、すべての障害がある試合、スタートの再する必要が
    速くKMPアルゴリズムの理由を、アルゴリズムの複雑さはO(M + N)であります
  3. そしてまた、KMPアルゴリズムのいくつかの類似した、このようBMアルゴリズムとして、日曜日のアルゴリズム

サンプルコード

class Solution {
public:
    int strStr(string haystack, string needle) {
        if (!needle.size())
            return 0;
        
        if (!haystack.size())
            return -1;
        
        vector<int> next;
        get_next(needle, next);

        int i = 0, j = 0;
        /* 
          这里要格外注意,调试了很久才找到错误原因
          必须对 string::size() 函数的返回值进行强制类型转换
        */
        while (i < (int)haystack.size() && j < (int)needle.size()) {
            if ((j == -1) || (haystack[i] == needle[j])) {
                i++;
                j++;
            } else {
                j = next[j];
            }
        }

        if (j == needle.size()) {
            return i - j;
        } else {
            return -1;
        }
    }
    
    void get_next(string &tmpl, vector<int> &next) {
        next.resize(tmpl.size());
        next[0] = -1;

        int k = -1;
        int j = 0;
        while (j < next.size() - 1)
        {
            if (k == -1 || tmpl[j] == tmpl[k]) 
            {
                k++;
                j++;
                if (tmpl[j] != tmpl[k])
                    next[j] = k;
                else
                    next[j] = next[k];
            }
            else 
            {
                k = next[k];
            }
        }
    }
};

おすすめ

転載: www.cnblogs.com/jiau/p/11655052.html