zoukankan      html  css  js  c++  java
  • acm专题---KMP模板

    KMP的子串长n,模式串长m,复杂度o(m+n),朴素做法的复杂度o((n-m+1)*m)

    觉得大话数据结果上面这个讲得特别好

    改进版本的KMP

    leetcode

    28. Implement strStr()

      

    class Solution {
    public:
        
        
        void getnext(string str,int next[])
    {
        int i=1;
        int j=0;
        next[1]=0;
        int str0=str.length()-1;
        while(i<=str0)
        {
            if(j==0||str[i]==str[j])
            {
                ++j;
                ++i;
                next[i]=j;
            }
            else
            {
                j=next[j];
            }
        }
        
    }
    int kmp(string s,string t)
    {
        int cnt=0;
        //int *next=new int[1000002];
        int next[1000002];
        getnext(t,next);
        int i=1;
        int j=1;
        int s0=s.length()-1,t0=t.length()-1;
        int idx=-1;
        while(i<=s0&&j<=t0)
        {
            if(j==0||s[i]==t[j])
            {
                ++i;
                ++j;
            }
            else
            {
                j=next[j];
            }
            if(j>t0)
            {
                cnt++;
                idx=i-t0-1;
                break;
                
            }
        }
        return idx;
    }
    
    int strStr(string haystack, string needle) {
        if(haystack.length()==0&&needle.length()<=haystack.length()||needle.length()==0) return 0;
        string tmpt="#",tmps="#";
        tmpt+=needle;
        tmps+=haystack;
        return kmp(tmps, tmpt);
            
    }
    };
    
    class Solution {
    public:
        
        void getnext(string str,int next[])
    {
        int i=1;
        int j=0;
        next[1]=0;
        int str0=str.length()-1;
        while(i<=str0)
        {
            if(j==0||str[i]==str[j])
            {
                ++j;
                ++i;
                if(str[i]!=str[j])
                    next[i]=j;
                else
                    next[i]=next[j];
            }
            else
            {
                j=next[j];
            }
        }
        
    }
    int kmp(string s,string t)
    {
        int cnt=0;
        //int *next=new int[1000002];
        int next[1000002];
        getnext(t,next);
        int i=1;
        int j=1;
        int s0=s.length()-1,t0=t.length()-1;
        int idx=-1;
        while(i<=s0&&j<=t0)
        {
            if(j==0||s[i]==t[j])
            {
                ++i;
                ++j;
            }
            else
            {
                j=next[j];
            }
            if(j>t0)
            {
                cnt++;
                idx=i-t0-1;
                break;
                
            }
        }
        return idx;
    }
    
    
    int strStr(string haystack, string needle) {
        if(haystack.length()==0&&needle.length()<=haystack.length()||needle.length()==0) return 0;
        string tmpt="#",tmps="#";
        tmpt+=needle;
        tmps+=haystack;
        return kmp(tmps, tmpt);
            
    }
    };
    

      

      

  • 相关阅读:
    元素的隐藏和显示
    dateformat-参数表
    HTTP缓存控制小结
    Shell 快捷键
    PHP中的cURL库
    选择排序法
    双系统重装windows后如何恢复ubuntu启动项
    dell 3420 独立显卡黄色感叹号不能用问题
    YUY数据转换为RGB数据,并进行灰度化处理显示
    ubuntu 15.04安装显卡驱动,出现登录界面闪烁得解决方案(dell 3420 )
  • 原文地址:https://www.cnblogs.com/wuxiangli/p/5625040.html
Copyright © 2011-2022 走看看