zoukankan      html  css  js  c++  java
  • 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测试程序源码

  • 相关阅读:
    结对项目刘畅2016012040
    Daily target小队介绍(刘畅,陈杰,杨有存,唐祎琳,王晓哲,邵汝佳)
    第四、十七章读书报告
    2016012040+小学四则运算练习软件项目报告
    JAVA之路(二)
    使用pip命令可能遇到的报错
    monkey命令
    Mitmproxy 手机配置代理
    appium安装与简单使用
    自动化测试第十一节---unittest
  • 原文地址:https://www.cnblogs.com/shine-yr/p/5214915.html
Copyright © 2011-2022 走看看