Open In App

Minimum Distance Between Words of a String

Last Updated : 12 Dec, 2022
Improve
Improve
Like Article
Like
Save
Share
Report

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 the 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 the minimum distance. 

Implementation:

C++




// C++ program to find Minimum Distance
// Between Words of a String
#include <bits/stdc++.h>
#include <sstream>
using namespace std;
 
// Function to implement split function
void split(const string &s, char delimiter,
                     vector<string> &words)
{
    string token;
    stringstream tokenStream(s);
 
    while (getline(tokenStream, token, delimiter))
        words.push_back(token);
}
 
// Function to calculate the minimum
// distance between w1 and w2 in s
int distance(string s, string w1, string w2)
{
    if (w1 == w2)
        return 0;
 
    // get individual words in a list
    vector<string> words;
    split(s, ' ', words);
 
    // assume total length of the string
    // as minimum distance
    int min_dist = words.size() + 1;
 
    // traverse through the entire string
    for (int index = 0; index < words.size(); index++)
    {
        if (words[index] == w1)
        {
            for (int search = 0;
                     search < words.size(); search++)
            {
                if (words[search] == w2)
                {
                    // the distance between the words is
                    // the index of the first word - the
                    // current word index
                    int 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
int main(int argc, char const *argv[])
{
    string s = "geeks for geeks contribute practice";
    string w1 = "geeks";
    string w2 = "practice";
    cout << distance(s, w1, w2) << endl;
    return 0;
}
 
// This code is contributed by
// sanjeev2552


Java




// 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


Python3




# 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))


C#




// 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) );
   
}
}


PHP




<?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
?>


Javascript




<script>
// Javascript 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
    let words = s.split(" ");
   
    // assume total length of the string
    // as minimum distance
    let min_dist = (words.length) + 1;
   
    // traverse through the entire string
    for (let index = 0;
         index < words.length ; index ++)
    {
   
        if (words[index] == ( w1))
        {
            for (let search = 0;
                 search < words.length; search ++)
            {
                if (words[search] == (w2))
                {
                    // the distance between the words is
                    // the index of the first word - the
                    // current word index
                    let 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
    let s = "geeks for geeks contribute practice";
    let w1 = "geeks" ;
    let w2 = "practice" ;
    document.write( distance(s, w1, w2) );
     
     
     
// This code is contributed by rag2127
</script>


Output

1

Complexity Analysis:

  • Time Complexity: O(n2)
  • Auxiliary Space: O(n)

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

Implementation:

C++




// C++ program to extract words from
// a string using stringstream
#include<bits/stdc++.h>
using namespace std;
 
int distance(string s, string w1, string w2)
{
 
  if (w1 == w2)
  {
    return 0;
  }
 
  vector<string> words;
 
  // Used to split string around spaces.
  istringstream ss(s);
 
  string word; // for storing each word
 
  // Traverse through all words
  // while loop till we get
  // strings to store in string word
  while (ss >> word)
  {
    words.push_back(word);
  }
 
  int n = words.size();
 
  // 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] == w1 || (words[i] == w2))
    {
      prev = i;
      break;
    }
  }
 
  // Traverse after the first occurrence
  while (i < n)
  {
    if (words[i] == w1 || (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]) &&
          (i - prev) < min_dist)
      {
        min_dist = i - prev - 1;
        prev = i;
      }
      else
      {
        prev = i;
      }
    }
    i += 1;
 
  }
  return min_dist;
}
 
// Driver code
int main()
{
  string s = "geeks for geeks contribute practice";
  string w1 = "geeks";
  string w2 = "practice";
  cout<<distance(s, w1, w2);
}
 
// This code is contributed by rutvik_56.


Java




// Java program to extract words from
// a string 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
    }
}


C#




// C# program to extract words from
// a string 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


Python3




# Python3 program to extract words from
# a string 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 = i
            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 = i
            else:
                prev = i
        i += 1       
 
    return min_dist
 
# Driver code
s = "geeks for geeks contribute practice"
w1 = "geeks"
w2 = "practice"
print(distance(s, w1, w2))


Javascript




<script>
 
// Javascript program to extract words from
// a string using stringstream
 
function distance(s,w1,w2)
{
    if (w1 == (w2))
    {
            return 0;
        }
  
       // get individual words in a list
        let words = s.split(" ");
        let n = words.length;
  
        // assume total length of the string as
        // minimum distance
        let 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
        let prev = 0, i = 0;
        for (i = 0; i < n; i++)
        {
  
            if (words[i] == (w1) || words[i] == (w2))
            {
                prev = i;
                break;
            }
        }
        // Traverse after the first occurrence
        while (i < n)
        {
            if (words[i] == (w1) || 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])) && (i - prev) < min_dist) {
                    min_dist = i - prev - 1;
                    prev = i;
                } else {
                    prev = i;
                }
  
            }
            i += 1;
        }
        return min_dist;
}
 
// Driver code
let s = "geeks for geeks contribute practice";
let w1 = "geeks";
let w2 = "practice";
document.write(distance(s, w1, w2));
     
// This code is contributed by avanitrachhadiya2155
</script>


Output

1

Complexity Analysis:

  • Time Complexity: O(n)
  • Auxiliary Space: O(1)

An efficient solution is to store the index of word1 in (lastpos) variable if word1 occur again then we update (lastpos) if word1 not occur then simply find the difference of index of word1 and word2.

Implementation:

C++




// C++ program to find Minimum Distance
// Between Words of a String
#include <bits/stdc++.h>
using namespace std;
 
int shortestDistance(vector<string> &s, string word1, string word2)
    {
         if(word1==word2) return  0;
        int ans = INT_MAX;
       //To store the lastposition of word1
        int lastPos = -1;
        for(int i = 0 ; i < s.size() ; i++)
        {
            if(s[i] == word1 || s[i] == word2)
            {
               //first occurrence of word1
                if(lastPos == -1)
                   lastPos = i;
                else
                {
                    //if word1 repeated again we store the last position of word1
                    if(s[lastPos]==s[i])
                     lastPos = i;
                    else
                    {
                      //find the difference of position of word1 and word2
                        ans = min(ans , (i-lastPos)-1);
                        lastPos = i;
                    }
                }
            }
        }
        return ans;
}
//Driver code
int main() {
    vector<string> s{"geeks", "for", "geeks", "contribute",
     "practice"};
     string w1 = "geeks";
    string w2 = "practice";
   
    cout<<shortestDistance(s, w1, w2)<<"\n";
     
    return 0;
}
       


Java




import java.util.ArrayList;
class Demo {
  static int shortestDistance(ArrayList<String> list,
                              String word1, String word2)
  {
    if (word1 == word2)
      return 0;
    int ans = Integer.MAX_VALUE;
    // To store the lastposition of word1
    int lastPos = -1;
    for (int i = 0; i < list.size(); i++) {
      if (list.get(i) == word1
          || list.get(i) == word2) {
        // first occurrence of word1
        if (lastPos == -1)
          lastPos = i;
        else {
          // if word1 repeated again we store the
          // last position of word1
          if (list.get(lastPos) == list.get(i))
            lastPos = i;
          else {
            // find the difference of position
            // of word1 and word2
            ans = Math.min(ans,
                           ((i - lastPos) - 1));
            lastPos = i;
          }
        }
      }
    }
    return ans;
  }
  public static void main(String arg[])
  {
    ArrayList<String> list = new ArrayList<>();
    list.add("geeks");
    list.add("for");
    list.add("geeks");
    list.add("contribute");
    list.add("practice");
    String w1 = "geeks";
    String w2 = "practice";
    System.out.println(shortestDistance(list, w1, w2));
  }
}
 
// This code is contributed by nmkiniqw7b.


Python




# Python program to find Minimum Distance
# Between Words of a String
def shortestDistance(s, word1, word2):
    if(word1 == word2):
        return 0
    ans = 1e9 + 7
     
    # To store the lastposition of word1
    lastPos = -1
    for i in range(0, len(s)):
 
        if(s[i] == word1 or s[i] == word2):
 
            # first occurrence of word1
            if(lastPos == -1):
                lastPos = i
            else:
 
                # if word1 repeated again we store the last position of word1
                if(s[lastPos] == s[i]):
                    lastPos = i
                else:
                    # find the difference of position of word1 and word2
                    ans = min(ans, (i - lastPos) - 1)
                    lastPos = i
 
    return ans
 
# Driver code
s = ["geeks", "for", "geeks", "contribute", "practice"]
w1 = "geeks"
w2 = "practice"
 
print(shortestDistance(s, w1, w2))
 
# This code is contributed by Samim Hossain Mondal.


C#




// C# program to find Minimum Distance
// Between Words of a String
using System;
using System.Collections.Generic;
 
public class GFG {
  static int shortestDistance(List<string> list,
                              string word1, string word2)
  {
    if (word1 == word2)
      return 0;
    int ans = Int32.MaxValue;
    // To store the lastposition of word1
    int lastPos = -1;
    for (int i = 0; i < list.Count; i++) {
      if (list[i] == word1 || list[i] == word2) {
        // first occurrence of word1
        if (lastPos == -1)
          lastPos = i;
        else {
          // if word1 repeated again we store the
          // last position of word1
          if (list[lastPos] == list[i])
            lastPos = i;
          else {
            // find the difference of position
            // of word1 and word2
            ans = Math.Min(ans,
                           ((i - lastPos) - 1));
            lastPos = i;
          }
        }
      }
    }
    return ans;
  }
  public static void Main(string[] arg)
  {
    List<string> list = new List<string>();
    list.Add("geeks");
    list.Add("for");
    list.Add("geeks");
    list.Add("contribute");
    list.Add("practice");
    string w1 = "geeks";
    string w2 = "practice";
    Console.WriteLine(shortestDistance(list, w1, w2));
  }
}
 
// This code is contributed by karandeep1234.


Javascript




// javascript program to find Minimum Distance
// Between Words of a String
 
function shortestDistance(s, word1, word2)
    {
         if(word1==word2)
            return  0;
        let ans = Number.MAX_SAFE_INTEGER;
        //To store the lastposition of word1
        let lastPos = -1;
        for(let i = 0 ; i < s.length ; i++)
        {
            if(s[i] == word1 || s[i] == word2)
            {
               //first occurrence of word1
                if(lastPos == -1)
                   lastPos = i;
                else
                {
                    //if word1 repeated again we store the last position of word1
                    if(s[lastPos]==s[i])
                     lastPos = i;
                    else
                    {
                      //find the difference of position of word1 and word2
                        ans = Math.min(ans , (i-lastPos)-1);
                        lastPos = i;
                    }
                }
            }
        }
        return ans;
}
 
// Driver code
      let s=["geeks", "for", "geeks", "contribute", "practice"];
      let w1 = "geeks";
      let w2 = "practice";
   
      console.log(shortestDistance(s, w1, w2));
     
       // This code is contributed by garg28harsh.


Output

1

Complexity Analysis:

  • Time Complexity: O(n)
  • Auxiliary Space: O(1)


Like Article
Suggest improvement
Previous
Next
Share your thoughts in the comments

Similar Reads