• LeetCode(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.

    Update (2014-11-02):
    The signature of the function had been updated to return the index instead of the pointer. If you still see your function signature returns a char * or String, please click the reload button to reset your code definition.

    分析

    这是一道模式匹配算法,给定两个字符串haystack与needle,给出needle在haystack完全匹配的首位置坐标(从0开始)。
    这道题在数据结构中有讲解,除了开始的简单模式匹配算法BF算法,还给出了改进后的KMP经典算法,下面分别用这两个算法实现。

    AC代码

    class Solution {
    public:
        //简单模式匹配算法(BF算法)
        int strStr(string haystack, string needle) {
            int len = strlen(haystack.c_str()), nl = strlen(needle.c_str());
    
            int i = 0, j = 0;
            while (i < len && j < nl)
            {
                if (haystack[i] == needle[j])
                {
                    i++;
                    j++;
                }
                else{
                    i = i - j + 1;
                    j = 0;
                }//else
            }//while
    
            if (j == nl)
                return i - nl;
            else
                return -1;
        }
    };

    KMP算法实现

    class Solution {
    public:
        //简单模式匹配算法(BF算法)
        int strStr(string haystack, string needle) {
            int len = strlen(haystack.c_str()), nl = strlen(needle.c_str());
    
            int i = 0, j = 0;
            while (i < len && j < nl)
            {
                if (haystack[i] == needle[j])
                {
                    i++;
                    j++;
                }
                else{
                    i = i - j + 1;
                    j = 0;
                }//else
            }//while
    
            if (j == nl)
                return i - nl;
            else
                return -1;
        }
    
        //从字符串haystack的第pos个位置开始匹配
        int KMP(const string &haystack, const string &needle, int pos)
        {
            int len = strlen(haystack.c_str()), nl = strlen(needle.c_str());
    
            int i = pos, j = 0;
            int *n = Next(needle);
            while (i < len && j < nl)
            {
                if (j == -1 || haystack[i] == needle[j])
                {
                    i++; 
                    j++;
                }
                else{
                    j = n[j];
                }//else     
            }//while
    
            if (j == nl)
                return i - nl;
            else
                return -1;
    
        }
    
        int* Next(const string &s)
        {
            int i = 0, j = -1;
            int next[500] ;
            int len = strlen(s.c_str());
            next[0] = -1;;
            while (i < len)
            {
                while (j >-1 && s[i] != s[j])
                    j = next[j];
                i++;
                j++;
    
                if (s[i] == s[j])
                    next[i] = next[j];
                else
                    next[i] = j;                
            }//while
            return next;
        }
    };

    GitHub测试程序源码

  • 相关阅读:
    [BZOJ2038]小Z的袜子
    [BZOJ5016]一个简单的询问
    [BZOJ1008][HNOI2008]越狱
    [FZU2254]英语考试
    利用Map 的merge方法统计数量
    List 原生态类型
    try-with-resource 关闭 io流
    利用构建器创建对象
    linux 安装 vault
    git 上传文件
  • 原文地址:https://www.cnblogs.com/shine-yr/p/5214915.html
Copyright © 2020-2023  润新知