字符串搜索
题目描述:
给定两个字符串A,B,判断B在A中是否存在,存在返回A中的下标,不存在就返回-1.
例如:
A: dasdqwdwad
B: qwdw
题目解析
我们可以直接暴力求解,用字符串B在A中进行一 一比对.
图形解释如下:
代码如下(我给两种方法):
//方法1:
public static int serach1(String A,String B){
//先将字符串转换为字符数组
char[] s1=str1.toCharArray();
char[] s2=str2.toCharArray();
//字符串A的长度
int m=A.length;
//字符串B的长度
int n=B.length;
//只需要循环m-n次就够了,也可以写成m
//这个循环是遍历A字符串
for(int i=0;i<=m-n;i++){
//这个循环是遍历B字符串
for(int j=0;j<n;j++){
//B中的字符和A中的字符不相等.
//i+j的原因是,如果相等的话,j++的时候i也要往后移动.
//如果想不明白的话,大家可以在草稿纸上模拟一下.
if(B[j] != A[i+j]){
break;
}
//走到这一步说明上面的步骤已经执行完了,
//当j=n-1的时候,说明字符串B遍历完了,并且满足条件.
//因为这个是在下面的if执行完后才进行的j++,所以要和n-1进行比较
if(j == (n-1)){
//最后返回下标
return i;
}
}
}
//不满足条件,返回-1.
return -1;
}
//方法2:
public static int serach2(String str1,String str2){
char[] s1=str1.toCharArray();
char[] s2=str2.toCharArray();
int l1=s1.length;
int l2=s2.length;
int i=0; //索引指向s1
int j=0; //索引指向s2
while (i<l1 && j<l2){ //保证匹配时不越界
if (s1[i]==s2[j]){ //匹配成功
i++;
j++;
}else{ //没有匹配成功,i后移一位,j重置为0
i=i-(j-1);
j=0;
}
}
//判断是否匹配成功
if (j==l2){
return i-j;
}
return -1;
}