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

Recommended: Please try your approach on {IDE} first, before moving on to the solution.

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.

C++

 // C++ program to find Minimum Distance  // Between Words of a String #include #include using namespace std;    // Function to implement split function void split(const string &s, char delimeter,                       vector &words) {     string token;     stringstream tokenStream(s);        while (getline(tokenStream, token, delimeter))         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 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



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

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

C#

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

Python3

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

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.