Skip to content

Files

Latest commit

c28dbd6 · Jun 21, 2024

History

History

2515.Shortest Distance to Target String in a Circular Array

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
Jun 21, 2024
Jun 21, 2024
Jan 13, 2024
Dec 25, 2022
Oct 31, 2023
Dec 25, 2022
Dec 25, 2022
Jun 21, 2024
Aug 31, 2023
Jan 13, 2024
comments difficulty edit_url rating source tags
true
简单
1367
第 325 场周赛 Q1
数组
字符串

English Version

题目描述

给你一个下标从 0 开始的 环形 字符串数组 words 和一个字符串 target环形数组 意味着数组首尾相连。

  • 形式上, words[i] 的下一个元素是 words[(i + 1) % n] ,而 words[i] 的前一个元素是 words[(i - 1 + n) % n] ,其中 nwords 的长度。

startIndex 开始,你一次可以用 1 步移动到下一个或者前一个单词。

返回到达目标字符串 target 所需的最短距离。如果 words 中不存在字符串 target ,返回 -1

 

示例 1:

输入:words = ["hello","i","am","leetcode","hello"], target = "hello", startIndex = 1
输出:1
解释:从下标 1 开始,可以经由以下步骤到达 "hello" :
- 向右移动 3 个单位,到达下标 4 。
- 向左移动 2 个单位,到达下标 4 。
- 向右移动 4 个单位,到达下标 0 。
- 向左移动 1 个单位,到达下标 0 。
到达 "hello" 的最短距离是 1 。

示例 2:

输入:words = ["a","b","leetcode"], target = "leetcode", startIndex = 0
输出:1
解释:从下标 0 开始,可以经由以下步骤到达 "leetcode" :
- 向右移动 2 个单位,到达下标 3 。
- 向左移动 1 个单位,到达下标 3 。
到达 "leetcode" 的最短距离是 1 。

示例 3:

输入:words = ["i","eat","leetcode"], target = "ate", startIndex = 0
输出:-1
解释:因为 words 中不存在字符串 "ate" ,所以返回 -1 。

 

提示:

  • 1 <= words.length <= 100
  • 1 <= words[i].length <= 100
  • words[i]target 仅由小写英文字母组成
  • 0 <= startIndex < words.length

解法

方法一:一次遍历

遍历数组,找到与 target 相等的单词,计算其与 startIndex 的距离 t ,则此时的最短距离为 m i n ( t , n t ) ,我们只需要不断更新最小值即可。

时间复杂度 O ( n ) ,空间复杂度 O ( 1 ) 。其中 n 为数组的长度。

Python3

class Solution:
    def closetTarget(self, words: List[str], target: str, startIndex: int) -> int:
        n = len(words)
        ans = n
        for i, w in enumerate(words):
            if w == target:
                t = abs(i - startIndex)
                ans = min(ans, t, n - t)
        return -1 if ans == n else ans

Java

class Solution {
    public int closetTarget(String[] words, String target, int startIndex) {
        int n = words.length;
        int ans = n;
        for (int i = 0; i < n; ++i) {
            String w = words[i];
            if (w.equals(target)) {
                int t = Math.abs(i - startIndex);
                ans = Math.min(ans, Math.min(t, n - t));
            }
        }
        return ans == n ? -1 : ans;
    }
}

C++

class Solution {
public:
    int closetTarget(vector<string>& words, string target, int startIndex) {
        int n = words.size();
        int ans = n;
        for (int i = 0; i < n; ++i) {
            auto w = words[i];
            if (w == target) {
                int t = abs(i - startIndex);
                ans = min(ans, min(t, n - t));
            }
        }
        return ans == n ? -1 : ans;
    }
};

Go

func closetTarget(words []string, target string, startIndex int) int {
	n := len(words)
	ans := n
	for i, w := range words {
		if w == target {
			t := abs(i - startIndex)
			ans = min(ans, min(t, n-t))
		}
	}
	if ans == n {
		return -1
	}
	return ans
}

func abs(x int) int {
	if x < 0 {
		return -x
	}
	return x
}

TypeScript

function closetTarget(words: string[], target: string, startIndex: number): number {
    const n = words.length;
    for (let i = 0; i <= n >> 1; i++) {
        if (words[(startIndex - i + n) % n] === target || words[(startIndex + i) % n] === target) {
            return i;
        }
    }
    return -1;
}

Rust

impl Solution {
    pub fn closet_target(words: Vec<String>, target: String, start_index: i32) -> i32 {
        let start_index = start_index as usize;
        let n = words.len();
        for i in 0..=n >> 1 {
            if words[(start_index - i + n) % n] == target || words[(start_index + i) % n] == target
            {
                return i as i32;
            }
        }
        -1
    }
}

C

int closetTarget(char** words, int wordsSize, char* target, int startIndex) {
    for (int i = 0; i <= wordsSize >> 1; i++) {
        if (strcmp(words[(startIndex - i + wordsSize) % wordsSize], target) == 0 || strcmp(words[(startIndex + i) % wordsSize], target) == 0) {
            return i;
        }
    }
    return -1;
}

方法二

Rust

use std::cmp::min;

impl Solution {
    pub fn closet_target(words: Vec<String>, target: String, start_index: i32) -> i32 {
        let mut ans = words.len();

        for (i, w) in words.iter().enumerate() {
            if *w == target {
                let t = ((i as i32) - start_index).abs();
                ans = min(ans, min(t as usize, words.len() - (t as usize)));
            }
        }

        if ans == words.len() {
            return -1;
        }

        ans as i32
    }
}