实现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; } };
------------恢复内容结束------------