You are given a 0-indexed circular string array words
and a string target
. A circular array means that the array's end connects to the array's beginning.
words[i]
is words[(i + 1) % n]
and the previous element of words[i]
is words[(i - 1 + n) % n]
, where n
is the length of words
.Starting from startIndex
, you can move to either the next word or the previous word with 1
step at a time.
Return the shortest distance needed to reach the string target
. If the string target
does not exist in words
, return -1
.
Example 1:
Input: words = [ "hello ", "i ", "am ", "leetcode ", "hello "], target = "hello ", startIndex = 1 Output: 1 Explanation: We start from index 1 and can reach "hello " by - moving 3 units to the right to reach index 4. - moving 2 units to the left to reach index 4. - moving 4 units to the right to reach index 0. - moving 1 unit to the left to reach index 0. The shortest distance to reach "hello " is 1.
Example 2:
Input: words = [ "a ", "b ", "leetcode "], target = "leetcode ", startIndex = 0 Output: 1 Explanation: We start from index 0 and can reach "leetcode " by - moving 2 units to the right to reach index 3. - moving 1 unit to the left to reach index 3. The shortest distance to reach "leetcode " is 1.
Example 3:
Input: words = [ "i ", "eat ", "leetcode "], target = "ate ", startIndex = 0
Output: -1
Explanation: Since "ate " does not exist in words
, we return -1.
Constraints:
1 <= words.length <= 100
1 <= words[i].length <= 100
words[i]
and target
consist of only lowercase English letters.0 <= startIndex < words.length
program main
implicit none
integer :: i, j, k, l, m, n
character(len=100), dimension(:), allocatable :: words
character(len=100) :: target
integer :: startIndex
integer :: result
! Examples
allocate(words(5))
words(1) = 'hello '
words(2) = 'i '
words(3) = 'am '
words(4) = 'leetcode '
words(5) = 'hello '
target = 'hello '
startIndex = 1
result = shortestDistance(words, target, startIndex)
write(*,*) 'Example 1:'
write(*,*) 'words = ', words
write(*,*) 'target = ', target
write(*,*) 'startIndex = ', startIndex
write(*,*) 'result = ', result
deallocate(words)
allocate(words(3))
words(1) = 'a '
words(2) = 'b '
words(3) = 'leetcode '
target = 'leetcode '
startIndex = 0
result = shortestDistance(words, target, startIndex)
write(*,*) 'Example 2:'
write(*,*) 'words = ', words
write(*,*) 'target = ', target
write(*,*) 'startIndex = ', startIndex
write(*,*) 'result = ', result
deallocate(words)
allocate(words(3))
words(1) = 'i '
words(2) = 'eat '
words(3) = 'leetcode '
target = 'ate '
startIndex = 0
result = shortestDistance(words, target, startIndex)
write(*,*) 'Example 3:'
write(*,*) 'words = ', words
write(*,*) 'target = ', target
write(*,*) 'startIndex = ', startIndex
write(*,*) 'result = ', result
contains
function shortestDistance(words, target, startIndex) result(res)
implicit none
character(len=*), dimension(:), intent(in) :: words
character(len=*), intent(in) :: target
integer, intent(in) :: startIndex
integer :: res
integer :: i, j, k, l, m, n
logical :: found
res = -1
found = .false.
do i = 1, size(words)
if (words(i) == target) then
found = .true.
exit
end if
end do
if (.not. found) return
res = 0
do while (.true.)
if (words(startIndex) == target) then
exit
end if
if (startIndex == 0) then
startIndex = size(words)
else
startIndex = startIndex - 1
end if
res = res + 1
end do
end function shortestDistance
end program main
temp.f95:86:16: 86 | startIndex = size(words) | 1 Error: Dummy argument ‘startindex’ with INTENT(IN) in variable definition context (assignment) at (1) temp.f95:88:16: 88 | startIndex = startIndex - 1 | 1 Error: Dummy argument ‘startindex’ with INTENT(IN) in variable definition context (assignment) at (1)
module shortest_distance_to_target
implicit none
contains
function shortest_distance(words, target, start_index) result(distance)
! Declare the variables
integer, dimension(size(words)) :: next_index, prev_index
integer :: distance, n, i, j, k
character(len=*), dimension(size(words)) :: words
character(len=*) :: target
integer :: start_index
! Initialize the variables
n = size(words)
distance = -1
! Find the next and previous indices of the target word
do i = 1, n
if (words(i) == target) then
next_index(i) = (i + 1) % n
prev_index(i) = (i - 1 + n) % n
distance = 0
exit
end if
end do
! If the target word is not found, return -1
if (distance == -1) then
return
end if
! Find the shortest distance to the target word
do i = 1, n
do j = 1, n
if (words(i) == words(j)) then
do k = 1, n
if (words(k) == target) then
distance = min(distance, abs(i - k) + abs(j - k))
exit
end if
end do
end if
end do
end do
end function shortest_distance
end module
! Test the shortest_distance function with the given examples
program test_shortest_distance
use shortest_distance_to_target
implicit none
! Declare the variables
integer, parameter :: n = 5
character(len=10), dimension(n) :: words
character(len=10) :: target
integer :: start_index, distance
! Test case 1:
words = ["hello ", "i ", "am ", "leetcode ", "hello "]
target = "hello "
start_index = 1
distance = shortest_distance(words, target, start_index)
write (*,*) "Test case 1: ", distance
! Test case 2:
words = ["a ", "b ", "leetcode "]
target = "leetcode "
start_index = 0
distance = shortest_distance(words, target, start_index)
write (*,*) "Test case 2: ", distance
! Test case 3:
words = ["i ", "eat ", "leetcode "]
target = "ate "
start_index = 0
distance = shortest_distance(words, target, start_index)
write (*,*) "Test case 3: ", distance
end program
temp.f95:10:24: 10 | integer, dimension(size(words)) :: next_index, prev_index | 1 Error: Symbol ‘words’ is used before it is typed at (1) temp.f95:12:33: 12 | character(len=*), dimension(size(words)) :: words | 1 Error: Symbol ‘words’ is used before it is typed at (1) temp.f95:7:32: 7 | function shortest_distance(words, target, start_index) result(distance) | 1 Error: Symbol ‘words’ at (1) has no IMPLICIT type temp.f95:22:8: 22 | if (words(i) == target) then | 1 Error: Function ‘words’ at (1) has no IMPLICIT type temp.f95:38:23: 38 | if (words(i) == words(j)) then | 1 Error: Function ‘words’ at (1) has no IMPLICIT type temp.f95:40:20: 40 | if (words(k) == target) then | 1 Error: Function ‘words’ at (1) has no IMPLICIT type temp.f95:56:5: 56 | use shortest_distance_to_target | 1 Fatal Error: Cannot open module file ‘shortest_distance_to_target.mod’ for reading at (1): No such file or directory compilation terminated.
def shortest_distance(words, target, startIndex):
n = len(words)
left, right, i = 0, 0, startIndex
while True:
if words[i] == target:
return min(left, right)
left += 1
right += 1
i = (i + 1) % n
if left == n:
break
return -1
The algorithm initializes the variables left, right, and i to count the minimum steps taken to reach the target string. It starts searching from the startIndex and iterates in a circular manner with the help of the modulo operator. When the word at the current index i matches the target, the minimum of left and right is returned as the shortest distance. If no matching word is found after the entire traversal, the algorithm returns -1. The reason for maintaining both left and right counters is that we are allowed to move in both directions (previous or next) from the startIndex. Both left and right counters are incremented in each iteration for every step taken during the search.
The code provided above is directly focused on solving the given problem, looping over until either the target is found or the traversal is complete, and in each language, the syntax is adapted to match the respective language conventions. The logic and algorithm stay the same across all languages.
int shortest_distance(vector<string>& words, string target, int startIndex) {
int n = words.size();
int left = 0, right = 0, i = startIndex;
while (true) {
if (words[i] == target) {
return min(left, right);
}
left++;
right++;
i = (i + 1) % n;
if (left == n) {
break;
}
}
return -1;
}
The algorithm initializes the variables left, right, and i to count the minimum steps taken to reach the target string. It starts searching from the startIndex and iterates in a circular manner with the help of the modulo operator. When the word at the current index i matches the target, the minimum of left and right is returned as the shortest distance. If no matching word is found after the entire traversal, the algorithm returns -1. The reason for maintaining both left and right counters is that we are allowed to move in both directions (previous or next) from the startIndex. Both left and right counters are incremented in each iteration for every step taken during the search.
The code provided above is directly focused on solving the given problem, looping over until either the target is found or the traversal is complete, and in each language, the syntax is adapted to match the respective language conventions. The logic and algorithm stay the same across all languages.