28. 实现 strStr()
思路:kmp算法。我的理解是使用一个next数组记录他的最长相等前后缀长度。如果查找串和模式串有不匹配的,就去回退到next数组的前一位。为什么会是前一位呢。因为前缀和后缀相等的就不需要再次遍历了。
class Solution { public: void getNext(int* next,const string &s){ int j = 0;//指向前缀末尾。 next[0] = 0; int i = 1; //指向后缀末尾。 for(;i < s.size(); i++){ while(j > 0 &&s[j] != s[i]){//前缀后缀不相等 j = next[j-1]; } if(s[j] == s[i]){ j++; } //前缀后缀相等 next[i] = j; } } int strStr(string haystack, string needle) { if (needle.size() == 0) { return 0; } int next[needle.size()] ; getNext(next,needle); int j = 0; int i = 0; for( ;i < haystack.size(); i++){ while(j>0&&haystack[i] != needle[j]){ j = next[j-1]; } if(haystack[i] == needle[j]){ j++; } if(j==needle.size()){ return i-j+1; } } return -1; } };
459.重复的子字符串
思路:感觉挺难的,想不到。方法就是将需判断的字符串加等本身形成一个新的字符串。
然后将新字符串的首尾去掉,再找里面有没有原来的串如果有则找到。
class Solution { public: bool repeatedSubstringPattern(string s) { string t = s + s; t.erase(t.begin()); t.erase(t.end()-1); if(t.find(s) != std::string::npos){ return true; } return false; } };