zoukankan      html  css  js  c++  java
  • [LeetCode]44. Implement strStr()实现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.

    解法1:暴力破解法,两重循环进行搜索,时间复杂度O(mn)。

    class Solution {
    public:
        int strStr(string haystack, string needle) {
            int n = haystack.size(), m = needle.size();
            if(n == 0 || m == 0)
            {
                if(n >= 0 && m == 0) return 0;
                return -1;
            }
            for(int i = 0; i < n - m + 1; i++)
            {
                int j = 0;
                for(; j < m; j++)
                {
                    if(haystack[i + j] != needle[j]) break;
                }
                if(j == m) return i;
            }
            return -1;
        }
    };

    解法2:在haystack里面匹配needle,使用Sunday算法进行模式匹配。时间复杂度O(m+n)。

    class Solution {
    public:
        int strStr(string haystack, string needle) {
            int pos = -1;
            bool res = sunday(haystack, needle, pos);
            return pos;
        }
    private:
        bool sunday(const string& text, const string& patt, int& pos)
        {
            int ts = text.size();
            int ps = patt.size();
            if (ts <= 0 || ps <= 0)
            {
                if (ts >= 0 && ps == 0)
                {
                    pos = 0;
                    return true;
                }
                return false;
            }
            vector<int> dis_tab(256, ps + 1);
            for (int i = 0; i < ps; ++i)
                dis_tab[(unsigned int)patt[i]] = ps - i;
    
            int end = ts - ps + 1;
            for (int i = 0; i < end;)
            {
                int j = 0;
                if (text[i] == patt[0])
                    while (i < ts && j < ps && text[i + j] == patt[j]) ++j;
                if (j == ps)
                {
                    pos = i + j - ps;
                    return true;
                }
                i += dis_tab[text[i + ps]];
            }
            return false;
        }
    };

     

  • 相关阅读:
    重构二叉树
    LeetCode-Construct Binary Tree from Preorder and Inorder Traversal
    二叉平衡树
    二叉树的三种递归与非递归遍历算法
    Jump Game
    Ubuntu中安装最新 Node.js 和 npm
    ORACLE查看并修改最大连接数
    设计模式之工厂模式
    设计模式之单例模式
    设计模式之模板方法模式
  • 原文地址:https://www.cnblogs.com/aprilcheny/p/4912395.html
Copyright © 2011-2022 走看看