首页 > 试题广场 >

数组中两个字符串的最小距离

[编程题]数组中两个字符串的最小距离
  • 热度指数:4125 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
给定一个字符串数组strs,再给定两个字符串str1和str2,返回在strs中str1和str2的最小距离,如果str1或str2为null,或不在strs中,返回-1。

输入描述:
输入包含有多行,第一输入一个整数n,代表数组strs的长度,第二行有两个字符串分别代表str1和str2,接下来n行,每行一个字符串,代表数组strs (保证题目中出现的所有字符串长度均小于等于10)。


输出描述:
输出一行,包含一个整数,代表返回的值。
示例1

输入

1
CD AB
CD

输出

-1
示例2

输入

5
QWER 666
QWER
1234
qwe
666
QWER

输出

1

备注:
时间复杂度,额外空间复杂度
import java.io.*;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine());
        String[] data=br.readLine().split(" ");
        String str1=data[0];
        String str2=data[1];
        String[]strs=new String[n];
       for (int i = 0; i <n; i++) {
            strs[i]=br.readLine();
        }
            int res = minDistance(strs, str1, str2);
            System.out.println(res);
        }
    
    public static int minDistance(String[]strs,String str1,String str2){
        if(str1==null||str2==null){
            return -1;
        }
        if(str1.equals(str2)){
            return 0;
        }
        int last1=-1;
        int last2=-1;
        int min=Integer.MAX_VALUE;
        for(int i=0; i<strs.length; i++){
            if(strs[i].equals(str1)){
                min=Math.min(min,last2==-1?min:i-last2);
                last1=i;
            }
            if(strs[i].equals(str2)){
                min=Math.min(min,last1==-1?min:i-last1);
                last2=i;
            }
        }
        return min==Integer.MAX_VALUE?-1:min;
    }
 }

发表于 2021-03-30 15:40:19 回复(0)

O(N)的时间复杂度,从左往右扫一遍,空间复杂度O(1)

扫到了记录last1last2分别表示str1str2最近出现的下标,那么i - last1i - last2就是最短的距离,一直更新这个最短距离。

import java.util.*;

public class Main {
    public static int process(String[] strs, String str1, String str2) {
        if (str1 == null || str2 == null) {
            return -1;
        }
        int last1 = -1, last2 = -1, min = Integer.MAX_VALUE;
        for (int i = 0; i < strs.length; i++) {
            if (strs[i].equals(str1)) {
                min = last2 == -1 ? min : Math.min(min, i - last2);
                last1 = i;
            } else if (strs[i].equals(str2)) {
                min = last1 == -1 ? min : Math.min(min, i - last1);
                last2 = i;
            }
        }
        return min == Integer.MAX_VALUE ? -1 : min;
    }
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        String str1 = sc.next();
        String str2 = sc.next();
        String[] strs = new String[n];
        for (int i = 0; i < n; i ++) {
            strs[i] = sc.next();
        }
        sc.close();
        int res = process(strs, str1, str2);
        System.out.println(res);
    }
}
发表于 2020-06-02 20:22:27 回复(0)