 GFG App
Open App Browser
Continue

# 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 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 ` `#include ` `using` `namespace` `std;`   `// Function to implement split function` `void` `split(``const` `string &s, ``char` `delimiter, ` `                     ``vector &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 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

 ``

## Javascript

 ``

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` `using` `namespace` `std;`   `int` `distance(string s, string w1, string w2) ` `{ `   `  ``if` `(w1 == w2)` `  ``{ ` `    ``return` `0; ` `  ``}`   `  ``vector 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<

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

 ``

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 ` `using` `namespace` `std;`   `int` `shortestDistance(vector &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 s{``"geeks"``, ``"for"``, ``"geeks"``, ``"contribute"``, ` `     ``"practice"``};` `     ``string w1 = ``"geeks"``;` `    ``string w2 = ``"practice"``;` `  `  `    ``cout<

## Java

 `import` `java.util.ArrayList;` `class` `Demo {` `  ``static` `int` `shortestDistance(ArrayList 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 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)

My Personal Notes arrow_drop_up