Skip to content
Related Articles
Get the best out of our app
GFG App
Open App
geeksforgeeks
Browser
Continue

Related Articles

Program to parse the Molecules and get the Atoms count

Improve Article
Save Article
Like Article
Improve Article
Save Article
Like Article

Given a chemical formula as a string, the task is to get the count of atoms in this chemical formula.
Examples: 
 

Input: str = "Fe2H3OH"
Output: Fe 2
        H 4
        O 1

Input: str = "NaCl2NaO2"
Output: Na 2
        Cl 2
        O 2

Approach: The below approach work in Java programming language: 
 

  • Take LinkedHashMap to store atom name(Key) and count(value) in insertion order.
  • Check if the string character is lowercase then add to the previous uppercase string character.
  • Check if the string contains the number then add to the count(value) to their particular atom name(key).
  • Print the atom name(key) as well as count(value). 

Below is the implementation of the above approach :
 

C++




#include <bits/stdc++.h>
using namespace std;
 
void getCount(string str)
{
  // Use LinkedHashmap to store
  // elements in insertion order
  map<string, int> mp;
 
  for (int i = 0; i < str.length(); i++) {
    int count = 0;
 
    // Convert the string element into character
    char c = str.at(i);
    string a = " ";
 
    // Convert the character element
    // into string element
    a = string(1, c);
 
    // Check string contains the Capital A - Z value.
    if (a.find_first_of("ABCDEFGHIJKLMNOPQRSTUVWXYZ") != string::npos) {
 
      for (int j = i + 1; j < str.length(); j++) {
 
        char d = str.at(j);
        string b = string(1, d);
 
        // Check string contains the small a-z value.
        if (b.find_first_of("abcdefghijklmnopqrstuvwxyz") != string::npos) {
 
          a += b;
 
          if (mp.find(a) == mp.end())
            mp[a] = 1;
          else
            mp[a] += 1;
          count = 1;
        }
 
        // Check string contains the number value.
        else if (b.find_first_of("0123456789") != string::npos) {
 
          int k = stoi(b);
          mp[a] = k;
          count = 1;
        }
 
        else {
          i = j - 1;
          break;
        }
      }
 
      if (count == 0) {
        if (mp.find(a) == mp.end())
          mp[a] = 1;
        else
          mp[a] += 1;
      }
    }
  }
 
  cout << "\nAtom count:" << endl;
  for (auto entry : mp)
    cout << entry.first << " " << entry.second << endl;
 
  mp.clear();
}
 
// Driver code
int main()
{
  string str = "Fe2H3OH";
  cout << "Given molecule: " << str << endl;
  getCount(str);
  return 0;
}
 
// This code is contributed by surajrasr7277.


Java




// Java program to parse the molecule
// and get the atoms count
 
import java.io.*;
import java.util.*;
 
class GFG {
 
    static void getCount(String str)
    {
 
        // Use LinkedHashmap to store
        // elements in insertion order
        Map<String, Integer> mp
            = new LinkedHashMap<String, Integer>();
 
        for (int i = 0; i < str.length(); i++) {
            int count = 0;
 
            // Convert the string element into character
            char c = str.charAt(i);
            String a = " ";
 
            // Convert the character element
            // into string element
            a = String.valueOf(c);
 
            // Check string contains the Capital A - Z value.
            if (a.matches("[A-Z]")) {
 
                for (int j = i + 1; j < str.length(); j++) {
 
                    char d = str.charAt(j);
                    String b = String.valueOf(d);
 
                    // Check string contains the small a-z value.
                    if (b.matches("[a-z]")) {
 
                        a += b;
 
                        if (mp.get(a) == null)
                            mp.put(a, 1);
                        else
                            mp.put(a, mp.get(a) + 1);
                        count = 1;
                    }
 
                    // Check string contains the number value.
                    else if (b.matches("[\\d]")) {
 
                        int k = Integer.parseInt(b);
                        mp.put(a, k);
                        count = 1;
                    }
 
                    else {
                        i = j - 1;
                        break;
                    }
                }
 
                if (count == 0) {
                    if (mp.get(a) == null)
                        mp.put(a, 1);
                    else
                        mp.put(a, mp.get(a) + 1);
                }
            }
        }
 
        System.out.println("\nAtom count:");
        for (Map.Entry<String, Integer>
                 entry : mp.entrySet())
            System.out.println(entry.getKey()
                               + " "
                               + entry.getValue());
 
        mp.clear();
    }
 
    // Driver code
    public static void main(String[] args)
    {
        String str = "Fe2H3OH";
        System.out.println("Given molecule: "
                           + str);
        getCount(str);
    }
}


Python3




# Python program to parse the molecule
# and get the atoms count
def get_count(s):
    # Use dictionary to store elements in insertion order
    mp = {}
 
    i = 0
    while i < len(s):
        count = 0
 
        # Convert the string element into character
        c = s[i]
 
        # Check string contains the Capital A - Z value.
        if c.isupper():
            a = " "
 
            # Convert the character element
            # into string element
            a += c
 
            j = i + 1
            while j < len(s):
                d = s[j]
 
                # Check string contains the small a-z value.
                if d.islower():
                    a += d
 
                    if a not in mp:
                        mp[a] = 1
                    else:
                        mp[a] += 1
                    count = 1
 
                # Check string contains the number value.
                elif d.isdigit():
                    k = int(d)
                    mp[a] = k
                    count = 1
                else:
                    i = j - 1
                    break
                j += 1
 
            if count == 0:
                if a not in mp:
                    mp[a] = 1
                else:
                    mp[a] += 1
 
        i += 1
 
    print("\nAtom count:")
    for key, value in mp.items():
        print(key, value)
 
    mp.clear()
 
# Driver code
str = "Fe2H3OH"
print("Given molecule:", str)
get_count(str)


C#




using System;
using System.Collections.Generic;
 
namespace GFG
{
  class Program
  {
 
    // Method to get the count of atoms
    static void getCount(String str)
    {
      // Use LinkedHashmap to store
      // elements in insertion order
      Dictionary<String, int> mp
        = new Dictionary<String, int>();
 
      for (int i = 0; i < str.Length; i++)
      {
        int count = 0;
 
        // Convert the string element into character
        char c = str[i];
        String a = " ";
 
        // Convert the character element
        // into string element
        a = c.ToString();
 
        // Check string contains the Capital A - Z value.
        if (System.Text.RegularExpressions.Regex.IsMatch(a, "[A-Z]"))
        {
 
          for (int j = i + 1; j < str.Length; j++)
          {
 
            char d = str[j];
            String b = " ";
 
            // Convert the character element
            // into string element
            b = d.ToString();
 
            // Check string contains the small a-z value.
            if (System.Text.RegularExpressions.Regex.IsMatch(b, "[a-z]"))
            {
 
              a += b;
 
              if (!mp.ContainsKey(a))
                mp.Add(a, 1);
              else
                mp[a] += 1;
              count = 1;
            }
 
            // Check string contains the number value.
            else if (System.Text.RegularExpressions.Regex.IsMatch(b, "[\\d]"))
            {
              int k = Convert.ToInt32(b);
              mp[a] = k;
              count = 1;
            }
 
            else
            {
              i = j - 1;
              break;
            }
          }
 
          if (count == 0)
          {
            if (!mp.ContainsKey(a))
              mp.Add(a, 1);
            else
              mp[a] += 1;
          }
        }
      }
 
      Console.WriteLine("\nAtom count:");
      foreach (KeyValuePair<String, int> entry in mp)
        Console.WriteLine(entry.Key
                          + " "
                          + entry.Value);
 
      mp.Clear();
    }
 
    // Driver code
    public static void Main(String[] args)
    {
      String str = "Fe2H3OH";
      Console.WriteLine("Given molecule: "
                        + str);
      getCount(str);
    }
  }
}
// This code added By Ajax


Javascript




// Javascript program to parse the molecule
// and get the atoms count
function get_count(s) {
// Use Map to store elements in insertion order
let mp = new Map();
 
let i = 0;
while (i < s.length) {
let count = 0;
// Convert the string element into character
let c = s.charAt(i);
 
// Check string contains the Capital A - Z value.
if (c.match(/[A-Z]/)) {
  let a = " ";
 
  // Convert the character element
  // into string element
  a += c;
 
  let j = i + 1;
  while (j < s.length) {
    let d = s.charAt(j);
 
    // Check string contains the small a-z value.
    if (d.match(/[a-z]/)) {
      a += d;
 
      if (!mp.has(a)) {
        mp.set(a, 1);
      } else {
        mp.set(a, mp.get(a) + 1);
      }
      count = 1;
    }
 
    // Check string contains the number value.
    else if (d.match(/[0-9]/)) {
      let k = parseInt(d);
      mp.set(a, k);
      count = 1;
    } else {
      i = j - 1;
      break;
    }
    j += 1;
  }
 
  if (count == 0) {
    if (!mp.has(a)) {
      mp.set(a, 1);
    } else {
      mp.set(a, mp.get(a) + 1);
    }
  }
}
i += 1;
}
 
console.log("\nAtom count:");
for (let [key, value] of mp) {
console.log(key, value);
}
 
mp.clear();
}
 
// Driver code
let str = "Fe2H3OH";
console.log("Given molecule:", str);
get_count(str);


Output: 

Given molecule: Fe2H3OH

Atom count:
Fe 2
H 4
O 1

 

Time Complexity: O(N), Here N is the length of the string.
Auxiliary Space: O(N), The extra space is used in HashMap.


My Personal Notes arrow_drop_up
Last Updated : 17 Mar, 2023
Like Article
Save Article
Similar Reads
Related Tutorials