实现strStr() leetcode 28

------------恢复内容开始------------

一.KMP算法

1.思路

利用kmp匹配字符串

2.代码及注释

class Solution {
public:
    //kmp算法 匹配字符串
    
    //定义全局二维数组dp和字符串pat
    vector<vector<int>> dp;
    string pat;
    
    //搜索过程
    int search(string txt){
        int j=0;
        int m = pat.size();
        int n = txt.size();
        //根据dp数组不断更新j的状态 直到j到达m终止状态即为搜索成果
        for(int i=0;i<n;i++){
            j = dp[j][txt[i]];
            if(j==m) return i-m+1;
        }
        //搜索失败返回-1
        return -1;
    }
    
    //kmp算法 构建dp二维数组,只于pat字符串有关
    vector<vector<int>> kmp(string pat){
        int m = pat.size();
        
        //X为影子状态 即为和当前状态拥有相同前缀的状态。 初始化定义为0。
        int X = 0;
        
        //定义dp二维数组
        vector<vector<int>> dp (m,vector<int>(256));
        
        /*
        1.定义dp初始值,当前为0状态 只有在遇到字符串的第一个字符才会转到1状态
        2.而其他则自动初始化为0 因为遇到其他字符都转到0状态
        */
        dp[0][pat[0]]=1;
        
        /*
        将所有的情况j*c(m*256)种情况进行遍历
        1.当c与pat[j]相等时,dp[j][pat[j]] = j+1;
        2.当c与pat[j]不想等时,状态j就更改为影子状态到c的下一跳状态。
        3.每当j执行完都需要更新影子状态X。
        */
        for(int j=1;j<m;j++){
            for(int c=0;c<256;c++){
                dp[j][c]=dp[X][c];
            }
            dp[j][pat[j]]=j+1;
            X = dp[X][pat[j]];
        }
        
        return dp;
    }
    int strStr(string haystack, string needle) {
        if(needle.size()==0) return 0;
        pat = needle;
        dp = kmp(needle);
        return search(haystack);
    }
};

二.暴力求解

1.思路

利用双指针求解

2.代码及注释

class Solution {
public:
    int strStr(string haystack, string needle) {
        if(needle=="") return 0;
        for(int i=0;i<haystack.size();i++){
            int j=0;
            while(j<needle.size()&&i+j<haystack.size()&&haystack[i+j]==needle[j]){
                j++;
            }
            if(j==needle.size()) return i;
        }
        return -1;
    }
};

 

------------恢复内容结束------------

posted @ 2020-01-03 17:23  谋莽台  阅读(129)  评论(0编辑  收藏  举报