方法一:正面考虑
即用计数器j看每个子串是否全部都与给定的str相等,相等则为子串,不等则不是。
class Solution {
public:
int strStr(string haystack, string needle) {
//考虑两个特殊情况:1.当needle为空串 2.当Str长度小于str。
int len1= haystack.size();
int len2=needle.size();
if(len2==0)return 0;
if(len1<len2)return -1;
//这里相当于从头到尾将Str分割成了若干个相同长度的子串。然后逐一判断,Str中是否存在该str子串。
for(int i=0;i<=len1-len2;i++){
if(haystack[i]==needle[0]){
int j=0;
//一定要考虑j是否越界!!!否则只能加个大括号每次都判断if语句了。
while((j<len2)&&(haystack[i+j]==needle[j]))
j++;
if(j==len2)
return i;
}
}
return -1;
}
};
方法二:反面考虑
所谓反面考虑就是遍历的每个子串一旦不与str相等,则跳出遍历下一个子串。
class Solution {
public:
int strStr(string haystack, string needle) {
//考虑两个特殊情况:1.当needle为空串 2.当Str长度小于str。
int len1= haystack.size();
int len2=needle.size();
if(len2==0)return 0;
if(len1<len2)return -1;
//这里相当于从头到尾将Str分割成了若干个相同长度的子串。然后逐一判断,Str中是否存在该str子串。
for(int i=0;i<=len1-len2;i++){
if(haystack[i]==needle[0]){
int j=0;
//与上一个方法就多加了一个flag用来标记,注意每次flag进行下一次子串判断的时候重新置1.
int flag = 1;
while(j<len2){
if(haystack[i+j]!=needle[j++]){
flag = 0;
break;
}
}
if(flag)
return i;
}
}
return -1;
}
};
总结与思考:
这两种方法实际都是一种方法,只不过思考判断是否为子串的思维不一样而已。。
给出总结:
1.当用while循环时一定要注意越界问题
2.当用flag进行标记的时候,一定要在合适的时候重新置1