一、题目
给定一个字符串数组strs,再给定两个字符串str1和str2,返回在strs中str1和str2的最小距离,如果str1或str2为null,或不在strs中,返回-1。
输入描述:
输入包含有多行,第一输入一个整数n(1≤n≤105)(1 \leq n \leq 10^5)(1≤n≤105),代表数组strs的长度,第二行有两个字符串分别代表str1和str2,接下来n行,每行一个字符串,代表数组strs (保证题目中出现的所有字符串长度均小于等于10)。
输出描述:
输出一行,包含一个整数,代表返回的值。
示例1
输入
1
CD AB
CD
输出
-1
示例2
输入
5
QWER 666
QWER
1234
qwe
666
QWER
输出
1
备注:
时间复杂度O(n)O(n)O(n),额外空间复杂度O(1)O(1)O(1)
二、思路解析
这道题用到的是 “预处理” 的思想,本质上是暴力解法的一种优化。
通过两个变量 prev1 和 prev2,来记录输入元素中等于 str1 或 str2 的下标位置,并用后一个减去前一个即可知道题目所求的距离。
再把如上操作,放到数组中,重复一遍,即可求出最小值~
具体实现请看下面代码👇
三、完整代码
import java.util.Scanner;
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();
int prev1 = -1;
int prev2 = -1;
int ret = 0x3f3f3f3f;
String[] ch = new String[n];
for(int i = 0; i < n; i++){
ch[i] = in.next();
if(ch[i].equals(str1)){
if(prev2 != -1){
ret = Math.min(ret, (i - prev2));
}
prev1 = i;
}
else if(ch[i].equals(str2)){
if(prev1 != -1){
ret = Math.min(ret, i - prev1);
}
prev2 = i;
}
}
System.out.println(ret == 0x3f3f3f3f ? -1 : ret);
}
}
以上就是本篇博客的全部内容啦,如有不足之处,还请各位指出,期待能和各位一起进步!