Open In App

Check whether frequency of characters in a string makes Fibonacci Sequence

Given a string with lowercase English alphabets. The task is to check whether the frequency of the characters in the string can be arranged as a Fibonacci series. If yes, print “YES”, otherwise print “NO”.

Note:



Examples:

Input : str = "abeeedd"
Output : YES
Frequency of 'a' => 1
Frequency of 'b' => 1
Frequency of 'e' => 3
Frequency of 'd' => 2
These frequencies are first 4 terms of 
Fibonacci series => {1, 1, 2, 3}

Input : str = "dzzddz"
Output : NO
Frequencies are not in Fibonacci series

Approach: 



Below is the implementation of the above approach:

// C++ program to check whether frequency of
// characters in a string makes
// Fibonacci Sequence
 
#include <bits/stdc++.h>
using namespace std;
 
int main() {
    string s = "abeedddccccc";
     
    // create a map to store the frequency of each character
    map<char, int> freq;
    for (char c : s) {
        freq++;
    }
     
    // create an array to store the frequency values
    int f[freq.size()];
    int i = 0;
    for (auto p : freq) {
        f[i] = p.second;
        i++;
    }
     
    // check if the frequency values form a Fibonacci sequence
    int n = freq.size();
    bool isFibonacci = true;
    sort(f, f + freq.size());
    if(f[0] != 1 || f[1] != 1)
        isFibonacci = false;
    else{
        for (int j = 2; j < n; j++) {
            if (f[j] != f[j-1] + f[j-2]) {
                isFibonacci = false;
                break;
            }
        }
    }
     
    // print the result
    if (isFibonacci) {
        cout << "YES" << endl;
    } else {
        cout << "NO" << endl;
    }
     
    return 0;
}

                    
// Java program to check whether frequency of
// characters in a string makes
// Fibonacci Sequence
import java.util.HashMap;
import java.util.Vector;
 
class GFG
{
 
    // Function to check if the frequencies
    // are in Fibonacci series
    static String isFibonacci(String s)
    {
 
        // map to store the
        // frequencies of character
        HashMap<Character,
                Integer> m = new HashMap<>();
        for (int i = 0; i < s.length(); i++)
            m.put(s.charAt(i),
            m.get(s.charAt(i)) == null ? 1 :
            m.get(s.charAt(i)) + 1);
 
        // Vector to store first n
        // fibonacci numbers
        Vector<Integer> v = new Vector<>();
 
        // Get the size of the map
        int n = m.size();
 
        // a and b are first and second terms of
        // fibonacci series
        int a = 1, b = 1;
 
        int c;
        v.add(a);
        v.add(b);
 
        // vector v contains elements of
        // fibonacci series
        for (int i = 0; i < n - 2; i++)
        {
            v.add(a + b);
            c = a + b;
            a = b;
            b = c;
        }
 
        int flag = 1;
        int i = 0;
 
        // Compare vector elements with values in Map
        for (HashMap.Entry<Character,
                           Integer> entry : m.entrySet())
        {
            if (entry.getValue() != v.elementAt(i))
            {
                flag = 1;
                break;
            }
 
            i++;
        }
         
        if (flag == 1)
            return "YES";
        else
            return "NO";
    }
 
    // Driver Code
    public static void main(String[] args)
    {
        String s = "abeebbbccccc";
        System.out.println(isFibonacci(s));
    }
}
 
// This code is contributed by
// sanjeev2552

                    
# Python3 program to check whether the frequency
# of characters in a string make Fibonacci Sequence
from collections import defaultdict
 
# Function to check if the frequencies
# are in Fibonacci series
def isFibonacci(s):
 
    # map to store the frequencies of character
    m = defaultdict(lambda:0)
 
    for i in range(0, len(s)):
        m[s[i]] += 1
 
    # Vector to store first n fibonacci numbers
    v = []
 
    # Get the size of the map
    n = len(m)
 
    # a and b are first and second
    # terms of fibonacci series
    a = b = 1
 
    v.append(a)
    v.append(b)
 
    # vector v contains elements of
    # fibonacci series
    for i in range(0, n - 2):
        v.append(a + b)
        c = a + b
        a, b = b, c
 
    flag, i = 1, 0
 
    # Compare vector elements with values in Map
    for itr in sorted(m):
        if m[itr] != v[i]:
            flag = 0
            break
         
        i += 1
     
    if flag == 1:
        return "YES"
    else:
        return "NO"
 
# Driver code
if __name__ == "__main__":
 
    s = "abeebbbccccc"
    print(isFibonacci(s))
 
# This code is contributed by Rituraj Jain

                    
// C# program to check whether frequency of
// characters in a string makes
// Fibonacci Sequence
using System;
using System.Collections.Generic;            
     
class GFG
{
 
    // Function to check if the frequencies
    // are in Fibonacci series
    static String isFibonacci(String s)
    {
 
        // map to store the
        // frequencies of character
        int i = 0;
        Dictionary<int,
                   int> mp = new Dictionary<int,
                                            int>();
        for (i = 0; i < s.Length; i++)
        {
            if(mp.ContainsKey(s[i]))
            {
                var val = mp[s[i]];
                mp.Remove(s[i]);
                mp.Add(s[i], val + 1);
            }
            else
            {
                mp.Add(s[i], 1);
            }
        }
 
        // List to store first n
        // fibonacci numbers
        List<int> v = new List<int>();
 
        // Get the size of the map
        int n = mp.Count;
 
        // a and b are first and second terms of
        // fibonacci series
        int a = 1, b = 1;
 
        int c;
        v.Add(a);
        v.Add(b);
 
        // vector v contains elements of
        // fibonacci series
        for (i = 0; i < n - 2; i++)
        {
            v.Add(a + b);
            c = a + b;
            a = b;
            b = c;
        }
 
        int flag = 1;
         
        // Compare vector elements with values in Map
        foreach(KeyValuePair<int, int> entry in mp)
        {
            if (entry.Value != v[i])
            {
                flag = 1;
                break;
            }
            i++;
        }
         
        if (flag == 1)
            return "YES";
        else
            return "NO";
    }
 
    // Driver Code
    public static void Main(String[] args)
    {
        String s = "abeebbbccccc";
        Console.WriteLine(isFibonacci(s));
    }
}
 
// This code is contributed by 29AjayKumar

                    
<script>
 
// Javascript program to check whether frequency of
// characters in a string makes
// Fibonacci Sequence
 
// Function to check if the frequencies
// are in Fibonacci series
function isFibonacci(s)
{
    // map to store the
    // frequencies of character
    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]));
        }
        else
        {
            m.set(s[i], 1);
        }
    }
 
    // Vector to store first n
    // fibonacci numbers
    var v = [];
 
    // Get the size of the map
    var n = m.length;
 
    // a and b are first and second terms of
    // fibonacci series
    var a = 1, b = 1;
 
    var c;
    v.push(a);
    v.push(b);
 
    // vector v contains elements of fibonacci series
    for (var i = 0; i < n - 2; i++) {
        v.push(a + b);
        c = a + b;
        a = b;
        b = c;
    }
 
    var flag = 1;
    var i = 0;
 
    // Compare vector elements with values in Map
    m.forEach((value, key) => {
        if (value != v[i]) {
            flag = 0;
        }
    });
 
    if (flag == 1)
        return "YES";
    else
        return "NO";
}
 
// Driver code
var s = "abeeedd";
document.write( isFibonacci(s));
 
</script>

                    

Output
YES

Complexity Analysis:


Article Tags :