package string;
/*
* 字符串匹配算法
*/
public class Sunday {
public static void main(String[] args) {
sunday("who are you"," ");
}
public static void sunday(String source,String parttern){
char[] sources = source.toCharArray();//源字符数组
char[] partterns = parttern.toCharArray();//匹配数组
int sIndex = 0;//源数组字符移动下标
int pIndex = 0;//匹配数组字符移动下标
int pCount = 0;//已经匹配个数
while(sIndex < sources.length && pIndex < partterns.length){
if(partterns[pIndex] == sources[sIndex]){
//如果字符匹配则进入下一轮循环
pIndex++;
sIndex++;
pCount++;
}else{
pCount = 0;//出现不匹配情况清空之前比较的数量
pIndex = 0;//同时使得匹配字符串置零重新开始,接下来求源字符串新匹配字符初始位置
//如果不匹配则定位元字符数组中位置位于此时匹配字符数组最后一个字符的后面一个字符
//如果在匹配字符串中能找到与源字符串的目标字符相匹配的字符,则重新调整匹配字符使得与源字符的目标字符对齐,
//再从目标字符串起始位置对应的源字符串的进行下一轮
int moveSIndex = sIndex + partterns.length;
if(moveSIndex >= sources.length){//判断是否越界
System.out.println("false");
return;
}
char moveChar = sources[moveSIndex];
int pipeiIndex = partterns.length - 1;//求匹配位置
while(pipeiIndex > -1){
if(moveChar == partterns[pipeiIndex]){
break;
}else{
pipeiIndex--;
}
}
if(pipeiIndex == -1){//如果都不匹配则从moveSIndex的下一位进行比较
sIndex = moveSIndex + 1;
}else{//如果匹配则重新调整两个字符串的初始比较位置,使得刚才匹配的字符对齐
sIndex = moveSIndex - pipeiIndex;
/**
* 如果这里不能理解,可以在上面的while循环中的if成立情况下添加一个计数器pipeiCount计数已经比较过的字符
* 通过partterns.length - pipeiCount算出未比较字符letterCount,再通过moveIndex-letterCount
* 即可获得源字符串的定位。
*/
}
}
//如果匹配成功则结束
if(pCount == partterns.length){
System.out.println("true");
break;
}
}
}
}