Find the first repeated word in a string
Given a string, Find the 1st repeated word in a string.
Examples:
Input: “Ravi had been saying that he had been there”
Output: had
Input: “Ravi had been saying that”
Output: No Repetition
Input: “he had had he”
he
question source: https://www.geeksforgeeks.org/goldman-sachs-interview-experience-set-29-internship/
Simple Approach : Start iterating from back and for every new word , store it in unordered map . For every word which has occurred more than one , update ans to be that word , at last reverse ans and print it.
Implementation:
C++
#include<bits/stdc++.h>
using namespace std;
void solve(string s)
{
unordered_map<string, int > mp;
string t= "" ,ans= "" ;
for ( int i=s.length()-1;i>=0;i--)
{
if (s[i]!= ' ' )
{
t+=s[i];
}
else
{
mp[t]++;
if (mp[t]>1)
ans=t;
t= "" ;
}
}
mp[t]++;
if (mp[t]>1)
ans=t;
if (ans!= "" )
{
reverse(ans.begin(),ans.end());
cout<<ans<< '\n' ;
}
else
cout<< "No Repetition\n" ;
}
int main()
{
string u= "Ravi had been saying that he had been there" ;
string v= "Ravi had been saying that" ;
string w= "he had had he" ;
solve(u);
solve(v);
solve(w);
return 0;
}
|
Java
import java.util.*;
public class GFG {
public static void solve(String s)
{
HashMap<String, Integer> mp
= new HashMap<String,
Integer>();
String t = "" ;
String ans = "" ;
for ( int i = s.length() - 1 ; i >= 0 ; i--) {
if (s.charAt(i) != ' ' ) {
t += s.charAt(i);
}
else {
if (!mp.containsKey(t)) {
mp.put(t, 1 );
}
else {
mp.put(t, mp.get(t) + 1 );
}
if (mp.get(t) > 1 ) {
ans = t;
}
t = "" ;
}
}
if (!mp.containsKey(t)) {
mp.put(t, 1 );
}
else {
mp.put(t, mp.get(t) + 1 );
}
if (mp.get(t) > 1 ) {
ans = t;
}
if (!ans.equals( "" )) {
StringBuilder input1 = new StringBuilder();
input1.append(ans);
input1.reverse();
System.out.println(input1);
}
else {
System.out.print( "No Repetition\n" );
}
}
public static void main(String[] args)
{
String u
= "Ravi had been saying that he had been there" ;
String v = "Ravi had been saying that" ;
String w = "he had had he" ;
solve(u);
solve(v);
solve(w);
}
}
|
Python3
def solve(s):
mp = {}
t = ""
ans = ""
for i in range ( len (s) - 1 , - 1 , - 1 ):
if (s[i] ! = ' ' ):
t + = s[i]
else :
if (t in mp):
ans = t
else :
mp[t] = 1
t = ""
if (t in mp):
ans = t
if (ans! = ""):
ans = ans[:: - 1 ]
print (ans)
else :
print ( "No Repetition" )
u = "Ravi had been saying that he had been there"
v = "Ravi had been saying that"
w = "he had had he"
solve(u)
solve(v)
solve(w)
|
C#
using System;
using System.Collections.Generic;
class GFG {
static void solve( string s)
{
Dictionary< string , int > mp = new Dictionary<
string , int >();
string t = "" ;
string ans = "" ;
for ( int i = s.Length - 1; i >= 0; i--) {
if (s[i] != ' ' ) {
t += s[i];
}
else {
if (mp.ContainsKey(t)) {
mp[t] += 1;
}
else {
mp.Add(t, 1);
}
if (mp[t] > 1) {
ans = t;
}
t = "" ;
}
}
if (mp.ContainsKey(t)) {
mp[t] += 1;
}
else {
mp.Add(t, 1);
}
if (mp[t] > 1) {
ans = t;
}
if (ans != "" ) {
char [] charArray = ans.ToCharArray();
Array.Reverse(charArray);
Console.WriteLine( new string (charArray));
}
else {
Console.Write( "No Repetition\n" );
}
}
public static void Main()
{
string u
= "Ravi had been saying that he had been there" ;
string v = "Ravi had been saying that" ;
string w = "he had had he" ;
solve(u);
solve(v);
solve(w);
}
}
|
Javascript
<script>
function solve(s)
{
let mp = new Map();
let t = "" ;
let ans = "" ;
for (let i = s.length - 1; i >= 0; i--)
{
if (s[i] != ' ' )
{
t += s[i];
}
else
{
if (mp.has(t))
ans = t;
else mp.set(t, 1)
t = "" ;
}
}
if (mp.has(t)) ans=t;
if (ans!= "" )
{
ans = [...ans].reverse().join( "" );
document.write(ans);
}
else
document.write( "No Repetition" );
}
const u = "Ravi had been saying that he had been there" ;
const v = "Ravi had been saying that" ;
const w = "he had had he" ;
solve(u);
solve(v);
solve(w);
</script>
|
Output
had
No Repetition
he
Time complexity: O(N),because of for loop
Space Complexity: O(N),because of unordered_map/hashmap
Another Approach: The idea is to tokenize the string and store each word and its count in hashmap. Then traverse the string again and for each word of string, check its count in created hashmap.
Implementation:
CPP
#include <bits/stdc++.h>
using namespace std;
string findFirstRepeated(string s)
{
istringstream iss(s);
string token;
unordered_map<string, int > setOfWords;
while (getline(iss, token, ' ' )) {
if (setOfWords.find(token) != setOfWords.end())
setOfWords[token] += 1;
else
setOfWords.insert(make_pair(token, 1));
}
istringstream iss2(s);
while (getline(iss2, token, ' ' )) {
int count = setOfWords[token];
if (count > 1) {
return token;
}
}
return "NoRepetition" ;
}
int main()
{
string s( "Ravi had been saying that he had been there" );
string firstWord = findFirstRepeated(s);
if (firstWord != "NoRepetition" )
cout << "First repeated word :: "
<< firstWord << endl;
else
cout << "No Repetitionn" ;
return 0;
}
|
Java
import java.util.*;
class GFG{
static String findFirstRepeated(String s)
{
String token[] = s.split( " " );
HashMap<String, Integer> setOfWords = new HashMap<String, Integer>();
for ( int i= 0 ; i<token.length; i++) {
if (setOfWords.containsKey(token[i]))
setOfWords.put(token[i], setOfWords.get(token[i]) + 1 );
else
setOfWords.put(token[i], 1 );
}
for ( int i= 0 ; i<token.length; i++) {
int count = setOfWords.get(token[i]);
if (count > 1 ) {
return token[i];
}
}
return "NoRepetition" ;
}
public static void main(String args[])
{
String s = "Ravi had been saying that he had been there" ;
String firstWord = findFirstRepeated(s);
if (!firstWord.equals( "NoRepetition" ))
System.out.println( "First repeated word :: " + firstWord);
else
System.out.println( "No Repetitionn" );
}
}
|
Python3
class GFG:
@staticmethod
def findFirstRepeated(s):
token = s.split( " " )
setOfWords = {}
for i in range ( len (token)):
if token[i] in setOfWords:
setOfWords[token[i]] + = 1
else :
setOfWords[token[i]] = 1
for i in range ( len (token)):
count = setOfWords[token[i]]
if count > 1 :
return token[i]
return "NoRepetition"
@staticmethod
def main(args):
s = "Ravi had been saying that he had been there"
firstWord = GFG.findFirstRepeated(s)
if firstWord ! = "NoRepetition" :
print ( "First repeated word :: " + firstWord)
else :
print ( "No Repetition" )
GFG.main([])
|
C#
using System;
using System.Collections.Generic;
using System.Collections;
using System.Linq;
class HelloWorld {
public static string findFirstRepeated( string s)
{
string [] token = s.Split( " " );
Dictionary< string , int > setOfWords = new Dictionary< string , int >();
for ( int i=0; i < token.Length; i++)
{
if (setOfWords.ContainsKey(token[i]) == true )
{
setOfWords[token[i]] = setOfWords[token[i]] + 1;
}
else
{
setOfWords.Add(token[i], 1);
}
}
for ( int i=0; i < token.Length; i++)
{
int count = setOfWords[token[i]];
if (count > 1)
{
return token[i];
}
}
return "NoRepetition" ;
}
static void Main() {
string s = "Ravi had been saying that he had been there" ;
string firstWord = findFirstRepeated(s);
if (firstWord != "NoRepetition" )
Console.WriteLine( "First repeated word :: " + firstWord);
else
Console.WriteLine( "No Repitition" );
}
}
|
Javascript
class GFG
{
static findFirstRepeated(s)
{
var token = s.split( " " );
var setOfWords = new Map();
for (let i=0; i < token.length; i++)
{
if (setOfWords.has(token[i]))
{
setOfWords.set(token[i],setOfWords.get(token[i]) + 1);
}
else
{
setOfWords.set(token[i],1);
}
}
for (let i=0; i < token.length; i++)
{
var count = setOfWords.get(token[i]);
if (count > 1)
{
return token[i];
}
}
return "NoRepetition" ;
}
static main(args)
{
var s = "Ravi had been saying that he had been there" ;
var firstWord = GFG.findFirstRepeated(s);
if (firstWord !== "NoRepetition" )
{
console.log( "First repeated word :: " + firstWord);
}
else
{
console.log( "No Repetitionn" );
}
}
}
GFG.main([]);
|
Output
First repeated word :: had
Method #2: Using built in python functions:
- As all the words in a sentence are separated by spaces.
- We have to split the sentence by spaces using split().
- We split all the words by spaces and store them in a list.
- Use Counter function to count frequency of words
- Traverse the list and check if any word has frequency greater than 1
- If it is present then print the word and break the loop
Implementation::
C++
#include <iostream>
#include <string>
#include <vector>
#include <unordered_map>
using namespace std;
string firstRepeatedWord(string sentence)
{
vector<string> words;
size_t pos = 0;
while ((pos = sentence.find( ' ' )) != string::npos)
{
string word = sentence.substr(0, pos);
words.push_back(word);
sentence.erase(0, pos + 1);
}
words.push_back(sentence);
unordered_map<string, int > frequency;
for ( size_t i = 0; i < words.size(); i++)
{
string word = words[i];
if (frequency.find(word) == frequency.end())
{
frequency[word] = 1;
}
else
{
frequency[word]++;
}
}
for ( size_t i = 0; i < words.size(); i++)
{
string word = words[i];
if (frequency[word] > 1)
{
return word;
}
}
return "No repeated word found" ;
}
int main()
{
string sentence = "Vikram had been saying that he had been there" ;
cout << firstRepeatedWord(sentence) << endl;
return 0;
}
|
Java
import java.util.*;
class GFG
{
public static String firstRepeatedWord(String sentence)
{
String[] lis = sentence.split( " " );
Map<String, Integer> frequency = new HashMap<>();
for ( int i = 0 ; i < lis.length; i++)
{
String word = lis[i];
if (!frequency.containsKey(word))
{
frequency.put(word, 1 );
}
else
{
frequency.put(word, frequency.get(word) + 1 );
}
}
for ( int i = 0 ; i < lis.length; i++)
{
String word = lis[i];
if (frequency.get(word) > 1 )
{
return word;
}
}
return "No repeated word found" ;
}
public static void main(String[] args)
{
String sentence = "Vikram had been saying that he had been there" ;
System.out.println(firstRepeatedWord(sentence));
}
}
|
Python3
C#
using System;
using System.Collections.Generic;
class Program
{
static string FirstRepeatedWord( string sentence)
{
List< string > words = new List< string >();
int pos;
while ((pos = sentence.IndexOf( ' ' )) != -1)
{
string word = sentence.Substring(0, pos);
words.Add(word);
sentence = sentence.Remove(0, pos + 1);
}
words.Add(sentence);
Dictionary< string , int > frequency = new Dictionary< string , int >();
foreach ( string word in words)
{
if (!frequency.ContainsKey(word))
{
frequency[word] = 1;
}
else
{
frequency[word]++;
}
}
foreach ( string word in words)
{
if (frequency[word] > 1)
{
return word;
}
}
return "No repeated word found" ;
}
static void Main()
{
string sentence = "Vikram had been saying that he had been there" ;
Console.WriteLine(FirstRepeatedWord(sentence));
}
}
|
Javascript
Another Approach:
Instead of tracking the counts for a specific token(word), we can keep track of the first occurrence of the token(word) using an unordered map. This would not require any extra loop to traverse in a hashmap or a string to find the repeated string. Thus, it eventually transforms the time complexity from O(2*n) to O(n) while the space complexity remains the same.
Implementation:
C++
#include <bits/stdc++.h>
using namespace std;
void solve(string s)
{
int n = s.size();
unordered_map<string, int >
mp;
string ans = "" , t = "" ;
int min_idx = INT_MAX;
int i = 0,
j = 0;
while (j <= n) {
if (s[j] == ' ' || j == n) {
if (mp[t] == 0) {
mp[t] = i + 1;
}
else {
if (min_idx > mp[t]) {
min_idx = mp[t];
ans = t;
}
}
t = "" ;
i = j + 1;
j = i;
}
else {
t += s[j];
j++;
}
}
if (ans == "" )
cout << "No Repetition" << endl;
else
cout << ans << endl;
}
int main()
{
string s1
= "Ravi had been saying that he had been there" ;
string s2 = "Ravi had been saying that" ;
string s3 = "he had had he" ;
solve(s1);
solve(s2);
solve(s3);
return 0;
}
|
Java
import java.io.*;
import java.util.*;
import java.util.*;
public class Main {
public static void solve(String s) {
int n = s.length();
Map<String, Integer> mp = new HashMap<>();
String ans = "" , t = "" ;
int min_idx = Integer.MAX_VALUE;
int i = 0 , j = 0 ;
while (j <= n) {
if (j == n || s.charAt(j) == ' ' ) {
if (mp.getOrDefault(t, 0 ) == 0 ) {
mp.put(t, i + 1 );
}
else {
if (min_idx > mp.get(t)) {
min_idx = mp.get(t);
ans = t;
}
}
t = "" ;
i = j + 1 ;
j = i;
}
else {
t += s.charAt(j);
j++;
}
}
if (ans.equals( "" ))
System.out.println( "No Repetition" );
else
System.out.println(ans);
}
public static void main(String[] args) {
String s1 = "Ravi had been saying that he had been there" ;
String s2 = "Ravi had been saying that" ;
String s3 = "he had had he" ;
solve(s1);
solve(s2);
solve(s3);
}
}
|
Python3
def find_first_repeated_word(s):
n = len (s)
mp = {}
ans = ""
t = ""
min_idx = float ( 'inf' )
i = 0
j = 0
while j < = n:
if j = = n or s[j] = = ' ' :
if t not in mp:
mp[t] = i + 1
else :
if min_idx > mp[t]:
min_idx = mp[t]
ans = t
t = ""
i = j + 1
j = i
else :
t + = s[j]
j + = 1
if ans = = "":
print ( "No Repetition" )
else :
print (ans)
s1 = "Ravi had been saying that he had been there"
s2 = "Ravi had been saying that"
s3 = "he had had he"
find_first_repeated_word(s1)
find_first_repeated_word(s2)
find_first_repeated_word(s3)
|
C#
using System;
using System.Collections.Generic;
public class MainClass
{
public static void Solve( string s)
{
int n = s.Length;
Dictionary< string , int > mp = new Dictionary< string , int >();
string ans = "" , t = "" ;
int min_idx = int .MaxValue;
int i = 0, j = 0;
while (j <= n)
{
if (j == n || s[j] == ' ' )
{
if (!mp.ContainsKey(t))
{
mp[t] = i + 1;
}
else
{
if (min_idx > mp[t])
{
min_idx = mp[t];
ans = t;
}
}
t = "" ;
i = j + 1;
j = i;
}
else
{
t += s[j];
j++;
}
}
if (ans == "" )
{
Console.WriteLine( "No Repetition" );
}
else
{
Console.WriteLine(ans);
}
}
public static void Main( string [] args)
{
string s1 = "Ravi had been saying that he had been there" ;
string s2 = "Ravi had been saying that" ;
string s3 = "he had had he" ;
Solve(s1);
Solve(s2);
Solve(s3);
}
}
|
Javascript
Output
had
No Repetition
he
This article is contributed by Aarti_Rathi and Mandeep Singh.
Last Updated :
20 Dec, 2023
Like Article
Save Article
Share your thoughts in the comments
Please Login to comment...