public static void main(String[] args) {
String s1 = "abcdeaawfaaabaaawwaa";
String s2 = "aa";
int i = indexOf(s1, s2);
System.out.println("i = " + i); // i = 5
}
public static int indexOf(String source,String target) {
char[] tar = target.toCharArray();
char[] sour = source.toCharArray();
// 找到目标的第一个字符
char first = tar[0];
// 0 1 2 3 0 1
// 计算遍历可能查找到最大索引的位置
int max = sour.length - tar.length;
// 遍历所有可能找到的索引
for (int i = 0; i < max; i++) {
// 快速找到目标第一个字符在原数组字符中的索引
if (sour[i] != first) {
while (++i < max && sour[i] != first);
}
// 如果目标字符长度为一直接比较相等则返回最近的字符索引
if (tar.length > 1) {
// 如果字符长度大于1,从当前i目标的下一个索引开始逐个标记目标的字符
int j = i + 1;
boolean f = false;
// 所需比较的次数等于目标数组从索引1的位置比较到结束
// 比较目标索引k 原索引j 两个每次索引同时向后移动
// 如果有一个不相等则修改标识位为true
for (int k = 1; k < tar.length; k++, j++) {
if (tar[k] != sour[j]) {
f = true;
}
}
// 如果标识位没变说明上个for循环比较字符都相同则返回索引位置
if (!f) {
return i;
}
} else {
if (sour[i] == first) {
return i;
}
}
}
return -1;
}