Open In App
Related Articles

Second most repeated word in a sequence

Improve
Improve
Improve
Like Article
Like
Save Article
Save
Report issue
Report

Given a sequence of strings, the task is to find out the second most repeated (or frequent) string in the given sequence.(Considering no two words are the second most repeated, there will be always a single word).

Examples: 

Input : {"aaa", "bbb", "ccc", "bbb", 
"aaa", "aaa"}
Output : bbb
Input : {"geeks", "for", "geeks", "for",
"geeks", "aaa"}
Output : for

Asked in : Amazon

BRUTE FORCE METHOD:

Implementation:

C++

#include <bits/stdc++.h>
using namespace std;
  
string secFrequent(string arr[], int N)
{
    unordered_map<string, int> um;
    // Counting frequency of each element
    for (int i = 0; i < N; i++) {
        if (um.find(arr[i]) != um.end()) {
            um[arr[i]]++;
        }
        else {
            um[arr[i]] = 1;
        }
    }
  
    int max = INT_MIN;
    vector<int> a;
    // Finding second maximum frequency
    for (auto j : um) {
        if (j.second > max) {
            max = j.second;
        }
    }
    for (auto j : um) {
        if (j.second != max) {
            a.push_back(j.second);
        }
    }
    sort(a.begin(), a.end());
    // Returning second most frequent element
    for (auto x : um) {
        if (x.second == a[a.size() - 1]) {
            return x.first;
        }
    }
    return "-1";
}
  
int main()
{
    string arr[]
        = { "ccc", "aaa", "ccc", "ddd", "aaa", "aaa" };
    int N = sizeof(arr) / sizeof(arr[0]);
    string ans = secFrequent(arr, N);
    cout << ans << endl;
    return 0;
}

                    

Java

// Java program to find out the second
// most repeated word
  
import java.io.*;
import java.util.*;
  
class GFG {
    public static String secFrequent(String arr[], int N)
    {
        // your code here
        HashMap<String, Integer> hm = new HashMap<>();
        for (int i = 0; i < N; i++) {
            if (hm.containsKey(arr[i])) {
                hm.put(arr[i], hm.get(arr[i]) + 1);
            }
            else {
                hm.put(arr[i], 1);
            }
        }
        int max = Collections.max(hm.values());
        ArrayList<Integer> a = new ArrayList<>();
        for (Map.Entry<String, Integer> j : hm.entrySet()) {
            if (j.getValue() != max) {
                a.add(j.getValue());
            }
        }
        Collections.sort(a);
        for (Map.Entry<String, Integer> x : hm.entrySet()) {
            if (x.getValue() == a.get(a.size() - 1)) {
                return x.getKey();
            }
        }
        return "-1";
    }
    public static void main(String[] args)
    {
        String arr[] = { "ccc", "aaa", "ccc",
                         "ddd", "aaa", "aaa" };
          int N = arr.length;
  
        String ans = secFrequent(arr, N);
        System.out.println(ans);
    }
}
//This code is contributed by Raunak Singh

                    

Python3

from collections import Counter
  
def secFrequent(arr):
    # Counting frequency of each element
    freq = Counter(arr)
  
    max_freq = max(freq.values())
    a = [x for x in freq.values() if x != max_freq]
    a.sort()
  
    # Returning second most frequent element
    for x in freq:
        if freq[x] == a[-1]:
            return x
  
    return "-1"
  
arr = ["ccc", "aaa", "ccc", "ddd", "aaa", "aaa"]
ans = secFrequent(arr)
print(ans)

                    

C#

using System;
using System.Collections.Generic;
using System.Linq;
  
class GFG
{
    static string SecFrequent(string[] arr)
    {
        Dictionary<string, int> um = new Dictionary<string, int>();
  
        // Counting frequency of each element
        for (int i = 0; i < arr.Length; i++)
        {
            if (um.ContainsKey(arr[i]))
            {
                um[arr[i]]++;
            }
            else
            {
                um[arr[i]] = 1;
            }
        }
  
        int max = int.MinValue;
        List<int> a = new List<int>();
  
        // Finding second maximum frequency
        foreach (var j in um)
        {
            if (j.Value > max)
            {
                max = j.Value;
            }
        }
  
        foreach (var j in um)
        {
            if (j.Value != max)
            {
                a.Add(j.Value);
            }
        }
  
        a.Sort();
  
        // Returning second most frequent element
        foreach (var x in um)
        {
            if (x.Value == a[a.Count - 1])
            {
                return x.Key;
            }
        }
  
        return "-1";
    }
  
    static void Main(string[] args)
    {
        string[] arr = { "ccc", "aaa", "ccc", "ddd", "aaa", "aaa" };
        string ans = SecFrequent(arr);
        Console.WriteLine(ans);
    }
}

                    

Javascript

function secFrequent(arr) {
  let um = new Map();
    
  // Counting frequency of each element
  for (let i = 0; i < arr.length; i++) {
    if (um.has(arr[i])) {
      um.set(arr[i], um.get(arr[i]) + 1);
    } else {
      um.set(arr[i], 1);
    }
  }
    
  let max = Number.MIN_SAFE_INTEGER;
  let a = [];
    
  // Finding second maximum frequency
  for (let [key, value] of um) {
    if (value > max) {
      max = value;
    }
  }
    
  for (let [key, value] of um) {
    if (value !== max) {
      a.push(value);
    }
  }
    
  a.sort((a, b) => a - b);
    
  // Returning second most frequent element
  for (let [key, value] of um) {
    if (value === a[a.length - 1]) {
      return key;
    }
  }
    
  return "-1";
}
  
let arr = ["ccc", "aaa", "ccc", "ddd", "aaa", "aaa"];
let ans = secFrequent(arr);
console.log(ans);

                    

Output
ccc

  • Time Complexity: O(NLog(N)).
  • Space Complexity: O(N).

Implementation:

C++

// C++ program to find out the second
// most repeated word
#include <bits/stdc++.h>
using namespace std;
  
// Function to find the word
string secMostRepeated(vector<string> seq)
{
  
    // Store all the words with its occurrence
    unordered_map<string, int> occ;
    for (int i = 0; i < seq.size(); i++)
        occ[seq[i]]++;
  
    // find the second largest occurrence
    int first_max = INT_MIN, sec_max = INT_MIN;
    for (auto it = occ.begin(); it != occ.end(); it++) {
        if (it->second > first_max) {
            sec_max = first_max;
            first_max = it->second;
        }
  
        else if (it->second > sec_max && 
                 it->second != first_max)
            sec_max = it->second;
    }
  
    // Return string with occurrence equals
    // to sec_max
    for (auto it = occ.begin(); it != occ.end(); it++)
        if (it->second == sec_max)
            return it->first;
}
  
// Driver program
int main()
{
    vector<string> seq = { "ccc", "aaa", "ccc",
                          "ddd", "aaa", "aaa" };
    cout << secMostRepeated(seq);
    return 0;
}

                    

Java

// Java program to find out the second
// most repeated word
  
import java.util.*;
  
class GFG 
{
    // Method to find the word
    static String secMostRepeated(Vector<String> seq)
    {
        // Store all the words with its occurrence
        HashMap<String, Integer> occ = new HashMap<String,Integer>(seq.size()){
            @Override
            public Integer get(Object key) {
                 return containsKey(key) ? super.get(key) : 0;
            }
        };
         
        for (int i = 0; i < seq.size(); i++)
            occ.put(seq.get(i), occ.get(seq.get(i))+1);
       
        // find the second largest occurrence
       int first_max = Integer.MIN_VALUE, sec_max = Integer.MIN_VALUE;
          
       Iterator<Map.Entry<String, Integer>> itr = occ.entrySet().iterator();
       while (itr.hasNext()) 
       {
           Map.Entry<String, Integer> entry = itr.next();
           int v = entry.getValue();
           if( v > first_max) {
                sec_max = first_max;
                first_max = v;
            }
       
            else if (v > sec_max && 
                     v != first_max)
                sec_max = v;
       }
         
       // Return string with occurrence equals
        // to sec_max
       itr = occ.entrySet().iterator();
       while (itr.hasNext()) 
       {
           Map.Entry<String, Integer> entry = itr.next();
           int v = entry.getValue();
           if (v == sec_max)
                return entry.getKey();
       }
         
       return null;
    }
      
    // Driver method
    public static void main(String[] args) 
    {
        String arr[] = { "ccc", "aaa", "ccc",
                         "ddd", "aaa", "aaa" };
        List<String> seq =  Arrays.asList(arr);
          
        System.out.println(secMostRepeated(new Vector<>(seq)));
    }    
}
// This program is contributed by Gaurav Miglani

                    

Python3

# Python3 program to find out the second
# most repeated word
  
# Function to find the word
def secMostRepeated(seq):
      
    # Store all the words with its occurrence
    occ = {}
    for i in range(len(seq)):
        occ[seq[i]] = occ.get(seq[i], 0) + 1
  
    # Find the second largest occurrence
    first_max = -10**8
    sec_max = -10**8
  
    for it in occ:
        if (occ[it] > first_max):
            sec_max = first_max
            first_max = occ[it]
              
        elif (occ[it] > sec_max and 
              occ[it] != first_max):
            sec_max = occ[it]
  
    # Return with occurrence equals
    # to sec_max
    for it in occ:
        if (occ[it] == sec_max):
            return it
  
# Driver code
if __name__ == '__main__':
      
    seq = [ "ccc", "aaa", "ccc",
            "ddd", "aaa", "aaa" ]
    print(secMostRepeated(seq))
  
# This code is contributed by mohit kumar 29

                    

C#

// C# program to find out the second
// most repeated word
using System;
using System.Collections.Generic;
  
class GFG 
{
    // Method to find the word
    static String secMostRepeated(List<String> seq)
    {
        // Store all the words with its occurrence
        Dictionary<String, int> occ = 
        new Dictionary<String, int>();
                  
        for (int i = 0; i < seq.Count; i++)
            if(occ.ContainsKey(seq[i]))
                occ[seq[i]] = occ[seq[i]] + 1;
            else
                occ.Add(seq[i], 1);
      
        // find the second largest occurrence
        int first_max = int.MinValue, 
            sec_max = int.MinValue;
          
        foreach(KeyValuePair<String, int> entry in occ)
        {
            int v = entry.Value;
            if( v > first_max) 
            {
                sec_max = first_max;
                first_max = v;
            }
          
            else if (v > sec_max && 
                    v != first_max)
                sec_max = v;
        }
          
        // Return string with occurrence equals
        // to sec_max
        foreach(KeyValuePair<String, int> entry in occ)
        {
            int v = entry.Value;
            if (v == sec_max)
                return entry.Key;
        }
              
        return null;
    }
      
    // Driver method
    public static void Main(String[] args) 
    {
        String []arr = { "ccc", "aaa", "ccc",
                        "ddd", "aaa", "aaa" };
        List<String> seq = new List<String>(arr);
          
        Console.WriteLine(secMostRepeated(seq));
    
}
  
// This code is contributed by Rajput-Ji

                    

Javascript

<script>
  
// JavaScript program to find out the second
// most repeated word
  
// Function to find the word
function secMostRepeated(seq)
{
  
    // Store all the words with its occurrence
    let occ = new Map();
    for (let i = 0; i < seq.length; i++)
    {
        if(occ.has(seq[i])){
            occ.set(seq[i], occ.get(seq[i])+1);
        }
        else occ.set(seq[i], 1);
    }
  
    // find the second largest occurrence
    let first_max = Number.MIN_VALUE, sec_max = Number.MIN_VALUE;
    for (let [key,value] of occ) {
        if (value > first_max) {
            sec_max = first_max;
            first_max = value;
        }
  
        else if (value > sec_max && value != first_max)
            sec_max = value;
    }
  
    // Return string with occurrence equals
    // to sec_max
    for (let [key,value] of occ)
        if (value == sec_max)
            return key;
}
  
// Driver program
let seq = [ "ccc", "aaa", "ccc", "ddd", "aaa", "aaa" ];
document.write(secMostRepeated(seq));
  
// This code is contributed by shinjanpatra
</script>

                    

Output
ccc

Time Complexity: O(N), where N represents the size of the given vector.
Auxiliary Space: O(N), where N represents the size of the given vector.

 



Last Updated : 15 Sep, 2023
Like Article
Save Article
Previous
Next
Share your thoughts in the comments
Similar Reads