简介
最近做我的项目的时候,发现无论是前端还是后端,indexOf 呈现的概率都十分频繁,明天咱们来看下他的实现原理吧!**indexOf 的含意:** 给定一个字符串去匹配另一个字符串的下标,如果匹配到,返回下标,如果匹配不到则返回 -1,其实原理还是比较简单的,如果须要你实现,那么应该怎么做呢?
原理
当初给定匹配的字符串 A,原始字符串 B,比方 匹配字符串 A 等于“叫练”,原始字符串 B 等于 “边叫边练, 我喜爱 叫练”,你可能一眼就发现 “叫练” 是最初两个字符,咱们以 B 做循环,一个一个单词去匹配,先找“叫”,找到计数器加 1,而后持续找“练”,发现下个字符不是“练”,计数器清零,从新从“叫”开始查找,当初查找到 B 的倒数第二个字符了,下个字符是“练”计算器再加 1,此时计数器等于 2 也正好是 A 字符串的长度,阐明找到了,查找原理就是这样一个过程;上面咱们别离以 Java,javascript,python 形式实现下。
留神:上面代码没有校验,仅供参考,python 是 index 办法,实现原理一样,但找不到会报错!
实现
Java 实现
public static void main(String[] args) {
String orgin = "边叫边练,我喜爱叫练";
String serach = "叫练";
int index = indexOf(orgin,serach);
System.out.println(index);
}
/**
* indexOf 算法原理
* @param orgin 原始字符串 B =“边叫边练,我喜爱叫练”;
* @param serachString 匹配字符串 A=“叫练”* @return int 下标
*/
public static int indexOf(String orgin,String serachString) {char[] chars = orgin.toCharArray();
char[] sChars = serachString.toCharArray();
// 返回字符串下标
int index = -1;
// 匹配字符串计数器,用于查问是否匹配到残缺字符串
int s_index = 0;
// 全局计数器,用于计算下标
int move = 0;
for (int i=0; i<chars.length; i++) {
move++;
// 如果匹配到“叫”, 持续向下开始匹配“练”if (chars[i] == sChars[s_index]) {
s_index++;
if(s_index == sChars.length) {
index = move-sChars.length;
break;
}
} else {s_index = 0;}
}
return index;
}
Javascript 实现
/**
* @param orgin 原始字符串 B =“边叫边练,我喜爱叫练”;
* @param serachString 匹配字符串 A=“叫练”**/
function indexOf(orgin,serachString) {
// 返回字符串下标
var index = -1;
// 匹配字符串计数器,用于查问是否匹配到残缺字符串
var s_index = 0;
// 全局计数器,用于计算下标
var move = 0;
for (var i=0; i<orgin.length; i++) {
move++;
// 如果匹配到“叫”, 持续向下开始匹配“练”if (orgin.substr(i,1) == serachString.substr(s_index,1)) {
s_index++;
if(s_index == serachString.length) {
index = move-serachString.length;
break;
}
} else {s_index = 0;}
}
return index;
}
python 实现
# indexOf 算法原理
# @param orgin 原始字符串 B =“边叫边练,我喜爱叫练”;
# @param serachString 匹配字符串 A=“叫练”# @return int 下标
def index(orgin, serachString):
# 返回字符串下标
index = -1
# 匹配字符串计数器,用于查问是否匹配到残缺字符串
s_index = 0
# 全局计数器,用于计算下标
move = 0
for letter in enumerate(orgin):
move = move + 1
# 如果匹配到“叫”, 持续向下开始匹配“练”if letter[1] == serachString[s_index]:
s_index = s_index + 1
if s_index == len(serachString):
index = move - len(serachString)
break
else:
s_index = 0;
return index