链接:数组中两个字符串的最小距离__牛客网
题目:给定一个字符串数组strs,再给定两个字符串str1和str2,返回在strs中str1和str2的最小距离,如果str1或str2为null,或不在strs中,返回-1。
思路:
给定两个下标,分别是prev1,prev2,各代表str1和str2在遍历过程中上次出现的位置,(prev1,prev2指针解释:比如我遍历strs的时候遍历到了下标3,前面(左边)下标2所指是str2,那么prev2=2),这里prev1,prev2下标意义很重要),第二步,开始遍历到i下标时i下标必须是两个目标字符串之一,此时要观察i下标左边出现的与i下标相比另一个目标字符串的下标,并更新prev1或者prev2,不懂文字没关系有
图例:
假设QWER和666是str1和str2 ret是最小距离结果
这里我们应该把prev1更新成0,因为下标0是目标字符串,而且所指QWER,对于后面的666是最近的
继续遍历,找到下一个目标字符串,此时i指向666,此时prev1已经不是-1,代表QWER已经在左边出现过了,可以求距离,更新ret值,特别注意这时候的666下标对于后面的QWER是最近的,所以要更新prev2的下标
继续遍历,i下标指向了QWER,这时候我们可以观察prev2值不是-1,证明666出现过了,可以求距离更新ret,但是别忘了更新prev1的下标,最后遍历完毕返回ret值
代码
import java.util.Scanner;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
String str1=in.next();
String str2=in.next();
String [] strs = new String[n];
for (int i = 0; i < n; i++) {
strs[i]= in.next();
}
//start
int prev1=-1,prev2=-1,ret=Integer.MAX_VALUE;
for (int i=0;i<strs.length;i++) {
if(strs[i].equals(str1)){
prev1=i;//更新prev1
}
if(strs[i].equals(str2)){
prev2=i;//更新prev2
}
//如果prev1和prev1都不是-1可以更新ret
if(prev1!=-1&&prev2!=-1) ret=Math.min(ret,Math.abs(prev1-prev2));
}
if(prev1==-1||prev2==-1)System.out.println(-1);//有一个字符串没有
else System.out.println(ret);
}
}