实现 strStr()
- 遍历字符串,判断当前位置
i
的字符是否等于子字符串的第一个字符并且i+l2-1
位置的字符是否等于子字符串的最后一个字符,l2
为子字符串的长度,如果头尾都相等,再用str.substr()截取字符串的这段字符,和子字符串比较是否相等,相等则得到答案。
class Solution {
public:
int strStr(string haystack, string needle) {
int l1=size(haystack);
int l2=size(needle);
if(l2==0) return 0;
for(int i=0;i<l1-l2+1;++i){
if(haystack[i]==needle[0]&&haystack[i+l2-1]==needle[l2-1]){
string s=haystack.substr(i,l2);
if(s==needle) return i;
}
}
return -1;
}
};
- 经典字符串匹配算法,kmp。
class Solution {
public:
vector<int> Next(string s){
vector<int> next(size(s));
int j=0;
next[0]=j;
for(int i=1;i<size(s);++i){
while(j>0&&s[i]!=s[j]){
j=next[j-1];
}
if(s[i]==s[j]) j++;
next[i]=j;
}
return next;
}
int strStr(string haystack, string needle) {
int l1=size(haystack);
int l2=size(needle);
if(l2==0) return 0;
vector<int> next=Next(needle);
int j=0;
for(int i=0;i<l1;++i){
while(j>0&&haystack[i]!=needle[j]){
j=next[j-1];
}
if(haystack[i]==needle[j]) j++;
if (j == l2) {
return (i - l2 + 1);
}
}
return -1;
}
};
重复的子字符串
- 题目链接
- 题意:给定一个非空的字符串,判断它是否可以由它的一个子串重复多次构成。
- 思路:如果可以重复,则字符串最后的字符一定是子字符串最后的字符。从下标0开始寻找字符串中和最后一个字符相等的字符的位置。如果字符串的长度是这段字符长度的n倍,则有可能是由子串重复得到的,于是再进行判断,对这段子串进行n倍的重复,如果重复n倍之后的字符串和原字符串相等,则它可以由它的一个子串重复多次构成。
class Solution {
public:
bool repeatedSubstringPattern(string s) {
int l=size(s);
for(int i=0;i<l/2;++i){
if(s[i]==s[l-1]){
if(l%(i+1)==0){
int n=l/(i+1);
string a=s.substr(0,i+1);
string ss;
while(n){
ss=ss+a;
n--;
}
if(ss==s) return true;
}
}
}
return false;
}
};