问题:在原字符串source中查找子串target,如果存在,则返回子串target的首字母在source中的索引
<思路>使用两层for循环,外层变量 i 遍历source的每一个字符,内层循环遍历target字符,比较source中从 i 开始到 (i+target)个字符是否逐一匹配,有一个字符不匹配则跳出内层循环,外层循环变量+1
<代码>
public int doSearch(String source,String target){
int max = source.length() - target.length();
for(int i = 0;i<=max;i++){
int matchCount = 0;
for(;matchCount < target.length()
&&(source.charAt(i+matchCount) == target.charAt(matchCount));matchCount++);
if(matchCount == target.length())
return i;
}
return -1;
}
代码中有几点注意:
1.max变量:
答:max表示source中需要比较的最长的字符串长度,如果过了这个长度,剩下的长度都比target的长度小,根本不可能匹配。【注意外层循环用的是小于等于max不是小于】
2.matchCount变量为什么不放在内层循环里面:
答:matchCount变量的作有两个,一个是target与source的子串比较的时候遍历target注意比较,二是作为匹配成功与否的判断依据,如果matchCount小于target的长度,就说明是中间有不一样的字符,提前跳出来了,如果相等,就说明全部匹配成功。
3.内层循环为什么还要有matchCount小于target.length这个判断条件:
因为在内层循环里面实质上也是一个遍历字符串数组的过程,所以就需要对用来索引的变量设置上限,不能超过target的长度,否则会越界
4.为什么最后的判断是matchCount等于target.length(),而不是target长度减去1:
匹配失败提前跳出来就不说了,如果是匹配成功,内层循环结束的条件是matchCount不满足小于target.length ,也就是说,在完成target最后一个字符的比较后(这个时候matchCount是等于target.length-1的),matchCount++让其不满足循环条件跳出循环,这才到了if的判断,所以不用减1