Minimum Distance Between Words of a String

Given a string s and two words w1 and w2 that are present in S. The task is to find the minimum distance between w1 and w2. Here distance is the number of steps or words between the first and the second word.

Examples:

Input : s = “geeks for geeks contribute practice”, w1 = “geeks”, w2 = “practice”
Output : 1
There is only one word between closest occurrences of w1 and w2.

Input : s = “the quick the brown quick brown the frog”, w1 = “quick”, w2 = “frog”
Output : 2

A simple approach is to consider every occurrence of w1. For every occurrence of w1, find the closest w2 and keep track of minimum distance.

Java

filter_none

edit
close

play_arrow

link
brightness_4
code

// Java program to find Minimum Distance 
// Between Words of a String
 class solution
 {
  
// Function to calculate the minimum 
// distance between w1 and w2 in s 
static int distance(String s,String w1,String w2)
{
       
    if (w1 .equals( w2) )
        return 0 ;
   
    // get individual words in a list 
    String words[] = s.split(" ");
   
    // assume total length of the string 
    // as minimum distance 
    int min_dist = (words.length) + 1;
   
    // traverse through the entire string 
    for (int index = 0;
         index < words.length ; index ++)
    {
   
        if (words[index] .equals( w1))
        {
            for (int search = 0
                 search < words.length; search ++) 
            {
                if (words[search] .equals(w2)) 
                {
                    // the distance between the words is 
                    // the index of the first word - the 
                    // current word index 
                    int curr = Math.abs(index - search) - 1
   
                    // comparing current distance with 
                    // the previously assumed distance 
                    if (curr < min_dist) 
                    {
                        min_dist = curr ;
                    }
                }
            }
        }
    }
       
    // w1 and w2 are same and adjacent 
    return min_dist;
}
   
// Driver code 
public static void main(String args[])
{
      
String s = "geeks for geeks contribute practice";
String w1 = "geeks" ;
String w2 = "practice" ;
   
System.out.print( distance(s, w1, w2) );
   
}
}
//contributed by Arnab Kundu

chevron_right


Python3

filter_none

edit
close

play_arrow

link
brightness_4
code

# function to calculate the minimum 
# distance between w1 and w2 in s
   
def distance(s, w1, w2): 
      
    if w1 == w2 :
       return 0
  
    # get individual words in a list
    words = s.split(" ")
  
    # assume total length of the string as
    # minimum distance
    min_dist = len(words)+1 
  
    # traverse through the entire string
    for index in range(len(words)):
  
        if words[index] == w1:
            for search in range(len(words)):
  
                if words[search] == w2: 
  
                    # the distance between the words is
                    # the index of the first word - the 
                    # current word index 
                    curr = abs(index - search) - 1;
  
                    # comparing current distance with 
                    # the previously assumed distance
                    if curr < min_dist:
                       min_dist = curr
  
    # w1 and w2 are same and adjacent
    return min_dist
      
  
# Driver code
s = "geeks for geeks contribute practice"
w1 = "geeks"
w2 = "practice"
print(distance(s, w1, w2))

chevron_right


C#

filter_none

edit
close

play_arrow

link
brightness_4
code

// C# program to find Minimum Distance 
// Between Words of a String
  
using System;
 class solution
 {
   
// Function to calculate the minimum 
// distance between w1 and w2 in s 
static int distance(string s,string w1,string w2)
{
        
    if (w1 .Equals( w2) )
        return 0 ;
    
    // get individual words in a list 
    string[] words = s.Split(" ");
    
    // assume total length of the string 
    // as minimum distance 
    int min_dist = (words.Length) + 1;
    
    // traverse through the entire string 
    for (int index = 0;
         index < words.Length ; index ++)
    {
    
        if (words[index] .Equals( w1))
        {
            for (int search = 0; 
                 search < words.Length; search ++) 
            {
                if (words[search] .Equals(w2)) 
                {
                    // the distance between the words is 
                    // the index of the first word - the 
                    // current word index 
                    int curr = Math.Abs(index - search) - 1; 
    
                    // comparing current distance with 
                    // the previously assumed distance 
                    if (curr < min_dist) 
                    {
                        min_dist = curr ;
                    }
                }
            }
        }
    }
        
    // w1 and w2 are same and adjacent 
    return min_dist;
}
    
// Driver code 
public static void Main()
{
       
string s = "geeks for geeks contribute practice";
string w1 = "geeks" ;
string w2 = "practice" ;
    
Console.Write( distance(s, w1, w2) );
    
}
}

chevron_right


PHP

filter_none

edit
close

play_arrow

link
brightness_4
code

<?php
// PHP program to find Minimum Distance 
// Between Words of a String
  
// Function to calculate the minimum 
// distance between w1 and w2 in s 
function distance($s, $w1, $w2)
{
      
    if ($w1 == $w2 )
        return 0 ;
  
    // get individual words in a list 
    $words = explode(" ", $s);
  
    // assume total length of the string 
    // as minimum distance 
    $min_dist = sizeof($words) + 1;
  
    // traverse through the entire string 
    for ($index = 0;
         $index < sizeof($words) ; $index ++)
    {
  
        if ($words[$index] == $w1)
        {
            for ($search = 0; 
                 $search < sizeof($words); $search ++) 
            {
                if ($words[$search] == $w2
                {
                    // the distance between the words is 
                    // the index of the first word - the 
                    // current word index 
                    $curr = abs($index - $search) - 1; 
  
                    // comparing current distance with 
                    // the previously assumed distance 
                    if ($curr < $min_dist
                    {
                        $min_dist = $curr ;
                    }
                }
            }
        }
    }
      
    // w1 and w2 are same and adjacent 
    return $min_dist;
}
  
// Driver code 
$s = "geeks for geeks contribute practice";
$w1 = "geeks" ;
$w2 = "practice" ;
  
echo distance($s, $w1, $w2) ;
  
// This code is contributed by Ryuga
?>

chevron_right


Output:

1

An efficient solution is to find first occurrence of any element, then keep track of previous element and current element, if they are different and distance is less than current minimum, update minimum.

Java

filter_none

edit
close

play_arrow

link
brightness_4
code

// Java program to extract words from
// a strung using stringstream
class GFG {
  
    static int distance(String s, String w1, String w2) {
  
        if (w1.equals(w2)) {
            return 0;
        }
  
       // get individual words in a list
        String[] words = s.split(" ");
        int n = words.length;
  
        // assume total length of the string as
        // minimum distance
        int min_dist = n + 1;
  
        // Find the first occurrence of any of the two 
        // numbers (w1 or w2) and store the index of
        // this occurrence in prev 
        int prev = 0, i = 0;
        for (i = 0; i < n; i++) {
  
            if (words[i].equals(w1) || words[i].equals(w2)) {
                prev = i;
                break;
            }
        }
        // Traverse after the first occurrence 
        while (i < n) {
            if (words[i].equals(w1) || words[i].equals(w2)) {
  
                // If the current element matches with
                // any of the two then check if current 
                // element and prev element are different 
                // Also check if this value is smaller than
                // minimum distance so far 
                if ((!words[prev].equals(words[i])) && (i - prev) < min_dist) {
                    min_dist = i - prev - 1;
                    prev = i;
                } else {
                    prev = i;
                }
  
            }
            i += 1;
  
        }
        return min_dist;
    }
// Driver code
  
    public static void main(String[] args) {
        String s = "geeks for geeks contribute practice";
        String w1 = "geeks";
        String w2 = "practice";
        System.out.println(distance(s, w1, w2));
// This code is contributed by princiRaj1992
    }
}

chevron_right


C#

filter_none

edit
close

play_arrow

link
brightness_4
code

// C# program to extract words from 
// a strung using stringstream 
using System;
  
class GFG 
  
    static int distance(String s, String w1, String w2) 
    
  
        if (w1.Equals(w2))
        
            return 0; 
        
  
        // get individual words in a list 
        String[] words = s.Split(" "); 
        int n = words.Length; 
  
        // assume total length of the string as 
        // minimum distance 
        int min_dist = n + 1; 
  
        // Find the first occurrence of any of the two 
        // numbers (w1 or w2) and store the index of 
        // this occurrence in prev 
        int prev = 0, i = 0; 
        for (i = 0; i < n; i++)
        
  
            if (words[i].Equals(w1) || words[i].Equals(w2)) 
            
                prev = i; 
                break
            
        
          
        // Traverse after the first occurrence 
        while (i < n) 
        
            if (words[i].Equals(w1) || words[i].Equals(w2)) 
            
  
                // If the current element matches with 
                // any of the two then check if current 
                // element and prev element are different 
                // Also check if this value is smaller than 
                // minimum distance so far 
                if ((!words[prev].Equals(words[i])) && 
                                (i - prev) < min_dist) 
                
                    min_dist = i - prev - 1; 
                    prev = i; 
                
                else 
                
                    prev = i; 
                
            
            i += 1; 
  
        
        return min_dist; 
    
      
    // Driver code 
    public static void Main(String[] args) 
    
        String s = "geeks for geeks contribute practice"
        String w1 = "geeks"
        String w2 = "practice"
        Console.Write(distance(s, w1, w2)); 
    
  
// This code is contributed by Mohit kumar 29

chevron_right


Python3

filter_none

edit
close

play_arrow

link
brightness_4
code

# Python3 program to extract words from
# a strung using stringstream
  
def distance(s, w1, w2): 
      
    if w1 == w2 :
       return 0
  
    # get individual words in a list
    words = s.split(" ")
    n = len(words)
  
    # assume total length of the string as
    # minimum distance
    min_dist = n+1 
  
    # Find the first occurrence of any of the two 
    # numbers (w1 or w2) and store the index of
    # this occurrence in prev 
    for i in range(n): 
          
        if words[i] == w1 or words[i] == w2: 
            prev =
            break
  
    # Traverse after the first occurrence 
    while i < n: 
        if words[i] == w1 or words[i] == w2: 
  
            # If the current element matches with
            # any of the two then check if current 
            # element and prev element are different 
            # Also check if this value is smaller than
            # minimum distance so far 
            if words[prev] != words[i] and (i - prev) < min_dist : 
                min_dist = i - prev - 1
                prev =
            else
                prev =
        i += 1        
  
    return min_dist 
  
# Driver code
s = "geeks for geeks contribute practice"
w1 = "geeks"
w2 = "practice"
print(distance(s, w1, w2))

chevron_right


Output:

1


My Personal Notes arrow_drop_up

Check out this Author's contributed articles.

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.





Article Tags :
Practice Tags :


Be the First to upvote.


Please write to us at contribute@geeksforgeeks.org to report any issue with the above content.