Open In App

Check if frequency of characters are in Recaman Series

Last Updated : 12 May, 2021
Improve
Improve
Like Article
Like
Save
Share
Report

Given a string of lowercase alphabets. The task is to check whether the frequency of alphabets in this string, after arranging in any possible manner, forms the Recaman’s Sequence(excluding the first term).
Print “YES” if they are in sequence, otherwise output “NO”.
Few starting terms of Recaman’s Sequence are: 
 

0, 1, 3, 6, 2, 7, 13, 20, 12, 21, 11, 22, 10, 23, 9, 24, 8 …. 
 

Note: First term of Recaman’s Sequence is not considered since it is zero.
Examples: 
 

Input  : str = "dddeweecceee"
Output : YES
Frequency of 'd' => 3
Frequency of 'e' => 6
Frequency of 'w' => 1
Frequency of 'c' => 2
These frequencies form the first 4 terms of 
Recaman's sequence => {1, 3, 6, 2}

Input : str = "geeksforgeeks"
Output : NO

 

Approach: 
 

  • Traverse the string and store the frequency of the characters in a map. Let the size of the map be N after storing the frequency.
  • Now, make an array and insert first N elements of Recaman’s sequence in it.
  • Now, traverse the array and check if the elements of the array are present as a key in map (excluding the check for zero).
  • If each and every element of array is present in map, output “YES”, otherwise “NO”.

Below is the implementation of the above approach: 
 

C++




// C++ program to check whether frequency of
// characters in a string makes
// Recaman Sequence
 
#include <bits/stdc++.h>
using namespace std;
 
// Function to fill the array with first N numbers
// from Recaman's Sequence
int recaman(int arr[], int n)
{
    // First term of the sequence is always 0
    arr[0] = 0;
 
    // Fill remaining terms using recursive
    // formula
    for (int i = 1; i <= n; i++) {
        int temp = arr[i - 1] - i;
        int j;
 
        for (j = 0; j < i; j++) {
 
            // If arr[i-1] - i is negative or
            // already exists.
            if ((arr[j] == temp) || temp < 0) {
                temp = arr[i - 1] + i;
                break;
            }
        }
 
        arr[i] = temp;
    }
}
 
// Function to check if the frequencies
// are in Recaman series
string isRecaman(string s)
{
    // Store frequencies of characters
    unordered_map<char, int> m;
    for (int i = 0; i < s.length(); i++)
        m[s[i]]++;   
 
    // Get the size of the map
    int n = m.size();
 
    int arr[n + 1];
    recaman(arr, n);
 
    int flag = 1;
 
    // Compare vector elements with values in Map
    for (auto itr = m.begin(); itr != m.end(); itr++) {
 
        int found = 0;
 
        for (int j = 1; j <= n; j++) {
            if (itr->second == arr[j]) {
                found = 1;
                break;
            }
        }
 
        if (found == 0) {
            flag = 0;
            break;
        }
    }
 
    if (flag == 1)
        return "YES";
    else
        return "NO";
}
 
// Driver code
int main()
{
    string s = "geeekkkkkkss";
    cout << isRecaman(s);
    return 0;
}


Java




// Java program to check whether frequency of
// characters in a string makes Recaman Sequence
import java.util.HashMap;
import java.util.Map;
 
class GfG
{
 
    // Function to fill the array with first
    // N numbers from Recaman's Sequence
    static void recaman(int arr[], int n)
    {
        // First term of the sequence is always 0
        arr[0] = 0;
     
        // Fill remaining terms using
        // recursive formula
        for (int i = 1; i <= n; i++)
        {
            int temp = arr[i - 1] - i;
     
            for (int j = 0; j < i; j++)
            {
     
                // If arr[i-1] - i is negative or
                // already exists.
                if ((arr[j] == temp) || temp < 0)
                {
                    temp = arr[i - 1] + i;
                    break;
                }
            }
     
            arr[i] = temp;
        }
    }
     
    // Function to check if the frequencies
    // are in Recaman series
    static String isRecaman(String s)
    {
        // Store frequencies of characters
        HashMap <Character, Integer> m = new HashMap<>();
        for (int i = 0; i < s.length(); i++)
             
            if (m.containsKey(s.charAt(i)))
                m.put(s.charAt(i), m.get(s.charAt(i))+1);
            else
                m.put(s.charAt(i), 1);
     
        // Get the size of the map
        int n = m.size();
     
        int arr[] = new int[n + 1];
        recaman(arr, n);
     
        int flag = 1;
     
        // Compare vector elements with values in Map
        for (Map.Entry mapEle : m.entrySet())
        {
     
            int found = 0;
     
            for (int j = 1; j <= n; j++)
            {
                if ((int)mapEle.getValue() == arr[j])
                {
                    found = 1;
                    break;
                }
            }
     
            if (found == 0)
            {
                flag = 0;
                break;
            }
        }
     
        if (flag == 1)
            return "YES";
        else
            return "NO";
    }
 
    // Driver code
    public static void main(String []args)
    {
        String s = "geeekkkkkkss";
        System.out.println(isRecaman(s));
    }
}
 
// This code is contributed by Rituraj Jain


Python3




# Python3 program to check whether
# frequency of characters in a string
# makes Recaman Sequence
 
# Function to fill the array with first
# N numbers from Recaman's Sequence
def recaman(arr, n) :
 
    # First term of the sequence
    # is always 0
    arr[0] = 0;
 
    # Fill remaining terms using
    # recursive formula
    for i in range(1, n + 1) :
        temp = arr[i - 1] - i;
 
        for j in range(i) :
 
            # If arr[i-1] - i is negative
            # or already exists.
            if ((arr[j] == temp) or temp < 0) :
                temp = arr[i - 1] + i;
                break;
                 
        arr[i] = temp;
 
# Function to check if the frequencies
# are in Recaman series
def isRecaman(s) :
     
    # Store frequencies of characters
    m = dict.fromkeys(list(s), 0);
     
    for i in range(len(s)) :
        m[s[i]] += 1;
 
    # Get the size of the map
    n = len(m);
 
    arr = [0] * (n + 1);
    recaman(arr, n);
 
    flag = 1;
 
    # Compare vector elements with
    # values in Map
    for keys in m.keys() :
 
        found = 0;
 
        for j in range(1, n + 1) :
            if (m[keys] == arr[j]) :
                found = 1;
                break;
         
        if (found == 0) :
            flag = 0;
            break;
 
    if (flag == 1) :
        return "YES";
    else :
        return "NO";
 
# Driver code
if __name__ == "__main__" :
 
    s = "geeekkkkkkss";
     
    print(isRecaman(s));
 
# This code is contributed by Ryuga


C#




// C# program to check whether frequency of
// characters in a string makes Recaman Sequence
using System;
using System.Collections.Generic;
 
class GFG
{
    // Function to fill the array with first
    // N numbers from Recaman's Sequence
    public static void recaman(int[] arr, int n)
    {
        // First term of the sequence is always 0
        arr[0] = 0;
         
        // Fill remaining terms using
        // recursive formula
        for (int i = 1; i <= n; i++)
        {
            int temp = arr[i - 1] - i;
            for (int j = 0; j < i; j++)
            {
                // If arr[i-1] - i is negative or
                // already exists.
                if ((arr[j] == temp) || temp < 0)
                {
                    temp = arr[i - 1] + i;
                    break;
                }
            }
 
            arr[i] = temp;
        }
    }
 
    // Function to check if the frequencies
    // are in Recaman series
    public static String isRecaman(String s)
    {
        // Store frequencies of characters
        Dictionary<char,
                   int> m = new Dictionary<char,
                                           int>();
        for (int i = 0; i < s.Length; i++)
        {
            if (m.ContainsKey(s[i]))
                m[s[i]]++;
            else
                m.Add(s[i], 1);
        }
 
        // Get the size of the map
        int n = m.Count;
        int[] arr = new int[n + 1];
        recaman(arr, n);
        int flag = 1;
         
        // Compare vector elements with values in Map
        foreach (KeyValuePair<char,
                              int> mapEle in m)
        {
            int found = 0;
            for (int j = 1; j <= n; j++)
            {
                if (mapEle.Value == arr[j])
                {
                    found = 1;
                    break;
                }
            }
 
            if (found == 0)
            {
                flag = 0;
                break;
            }
        }
 
        if (flag == 1)
            return "YES";
        else
            return "NO";
    }
 
    // Driver code
    public static void Main(String[] args)
    {
        String s = "geeekkkkkkss";
        Console.WriteLine(isRecaman(s));
    }
}
 
// This code is contributed by
// sanjeev2552


Javascript




<script>
 
// Javascript program to check whether frequency of
// characters in a string makes
// Recaman Sequence
 
// Function to fill the array with first N numbers
// from Recaman's Sequence
function recaman(arr, n)
{
    // First term of the sequence is always 0
    arr[0] = 0;
 
    // Fill remaining terms using recursive
    // formula
    for (var i = 1; i <= n; i++) {
        var temp = arr[i - 1] - i;
        var j;
 
        for (j = 0; j < i; j++) {
 
            // If arr[i-1] - i is negative or
            // already exists.
            if ((arr[j] == temp) || temp < 0) {
                temp = arr[i - 1] + i;
                break;
            }
        }
 
        arr[i] = temp;
    }
}
 
// Function to check if the frequencies
// are in Recaman series
function isRecaman(s)
{
    // Store frequencies of characters
    var m = new Map();
    for (var i = 0; i < s.length; i++)
    {
        if(m.has(s[i]))
        {
            m.set(s[i], m.get(s[i])+1);
        }
        else
        {
            m.set(s[i], 1);
        }
    }
 
    // Get the size of the map
    var n = m.size;
 
    var arr = Array(n+1).fill(0);
    recaman(arr, n);
 
    var flag = 1;
 
    // Compare vector elements with values in Map
    m.forEach((value, key) => {
          var found = 0;
 
        for (var j = 1; j <= n; j++) {
            if (value == arr[j]) {
                found = 1;
                break;
            }
        }
 
        if (found == 0) {
            flag = 0;
        }
    });
    
    if (flag == 1)
        return "YES";
    else
        return "NO";
}
 
// Driver code
var s = "geeekkkkkkss";
document.write( isRecaman(s));
 
</script>


Output: 

YES

 



Like Article
Suggest improvement
Share your thoughts in the comments

Similar Reads