Check if frequency of characters are in Recaman Series
Last Updated :
12 May, 2021
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++
#include <bits/stdc++.h>
using namespace std;
int recaman( int arr[], int n)
{
arr[0] = 0;
for ( int i = 1; i <= n; i++) {
int temp = arr[i - 1] - i;
int j;
for (j = 0; j < i; j++) {
if ((arr[j] == temp) || temp < 0) {
temp = arr[i - 1] + i;
break ;
}
}
arr[i] = temp;
}
}
string isRecaman(string s)
{
unordered_map< char , int > m;
for ( int i = 0; i < s.length(); i++)
m[s[i]]++;
int n = m.size();
int arr[n + 1];
recaman(arr, n);
int flag = 1;
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" ;
}
int main()
{
string s = "geeekkkkkkss" ;
cout << isRecaman(s);
return 0;
}
|
Java
import java.util.HashMap;
import java.util.Map;
class GfG
{
static void recaman( int arr[], int n)
{
arr[ 0 ] = 0 ;
for ( int i = 1 ; i <= n; i++)
{
int temp = arr[i - 1 ] - i;
for ( int j = 0 ; j < i; j++)
{
if ((arr[j] == temp) || temp < 0 )
{
temp = arr[i - 1 ] + i;
break ;
}
}
arr[i] = temp;
}
}
static String isRecaman(String s)
{
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 );
int n = m.size();
int arr[] = new int [n + 1 ];
recaman(arr, n);
int flag = 1 ;
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" ;
}
public static void main(String []args)
{
String s = "geeekkkkkkss" ;
System.out.println(isRecaman(s));
}
}
|
Python3
def recaman(arr, n) :
arr[ 0 ] = 0 ;
for i in range ( 1 , n + 1 ) :
temp = arr[i - 1 ] - i;
for j in range (i) :
if ((arr[j] = = temp) or temp < 0 ) :
temp = arr[i - 1 ] + i;
break ;
arr[i] = temp;
def isRecaman(s) :
m = dict .fromkeys( list (s), 0 );
for i in range ( len (s)) :
m[s[i]] + = 1 ;
n = len (m);
arr = [ 0 ] * (n + 1 );
recaman(arr, n);
flag = 1 ;
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" ;
if __name__ = = "__main__" :
s = "geeekkkkkkss" ;
print (isRecaman(s));
|
C#
using System;
using System.Collections.Generic;
class GFG
{
public static void recaman( int [] arr, int n)
{
arr[0] = 0;
for ( int i = 1; i <= n; i++)
{
int temp = arr[i - 1] - i;
for ( int j = 0; j < i; j++)
{
if ((arr[j] == temp) || temp < 0)
{
temp = arr[i - 1] + i;
break ;
}
}
arr[i] = temp;
}
}
public static String isRecaman(String s)
{
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);
}
int n = m.Count;
int [] arr = new int [n + 1];
recaman(arr, n);
int flag = 1;
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" ;
}
public static void Main(String[] args)
{
String s = "geeekkkkkkss" ;
Console.WriteLine(isRecaman(s));
}
}
|
Javascript
<script>
function recaman(arr, n)
{
arr[0] = 0;
for ( var i = 1; i <= n; i++) {
var temp = arr[i - 1] - i;
var j;
for (j = 0; j < i; j++) {
if ((arr[j] == temp) || temp < 0) {
temp = arr[i - 1] + i;
break ;
}
}
arr[i] = temp;
}
}
function isRecaman(s)
{
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);
}
}
var n = m.size;
var arr = Array(n+1).fill(0);
recaman(arr, n);
var flag = 1;
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" ;
}
var s = "geeekkkkkkss" ;
document.write( isRecaman(s));
</script>
|
Share your thoughts in the comments
Please Login to comment...