Count of non-empty sequences of a String
Last Updated :
25 Apr, 2023
Given a string s, the task is to find the number of possible non-empty sequences of letters that can be made.
Examples:
Input: "AAB"
Output: 8
Explanation:
1) A
2) AA
3) AAB
4) AB
5) ABA
6) B
7) BA
8) BAA
Total 8 possibilities
Input: "AAABBC"
Output: 188
Approach: There are two possibilities either take the current character to our answer or leave it. We can solve this problem
To check for duplicates we can take set as a data Structure and will put our answers there and our count will be the size of our set.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
void recur(string& tiles, vector< bool > vis, string ans,
set<string>& se)
{
if (ans.size() > 0) {
if (se.count(ans))
return ;
se.insert(ans);
}
for ( int i = 0; i < tiles.size(); i++) {
if (vis[i])
continue ;
vis[i] = true ;
recur(tiles, vis, ans + tiles[i], se);
vis[i] = false ;
}
}
int main()
{
string s = "AAABBC" ;
string curr = "" ;
set<string> se;
vector< bool > vis(s.size(), false );
recur(s, vis, curr, se);
int ans = se.size();
cout << ans << '\n' ;
return 0;
}
|
Java
import java.util.*;
public class Main
{
static HashSet<String> se = new HashSet<String>();
static String tiles;
static void recur(Vector<Boolean> vis, String ans)
{
if (ans.length()> 0 )
{
if (se.contains(ans))
{
return ;
}
se.add(ans);
}
for ( int i = 0 ; i < tiles.length(); i++)
{
if (vis.get(i))
continue ;
vis.set(i, true );
recur(vis, ans + tiles.charAt(i));
vis.set(i, false );
}
}
public static void main(String[] args)
{
tiles = "AAABBC" ;
String curr = "" ;
Vector<Boolean> vis = new Vector<Boolean>();
for ( int i = 0 ; i < tiles.length(); i++)
{
vis.add( false );
}
recur(vis, curr);
System.out.print(se.size());
}
}
|
Python
def recur(vis, ans):
global tiles, se
if ( len (ans) > 0 ):
if (ans in se):
return
se[ans] = 1
for i in range ( len (tiles)):
if (vis[i]):
continue
vis[i] = True
recur(vis, ans + tiles[i])
vis[i] = False
tiles = "AAABBC"
curr = ""
se = dict ()
vis = [ False ] * ( len (tiles))
recur(vis, curr)
print ( len (se))
|
C#
using System;
using System.Collections.Generic;
class GFG {
static HashSet< string > se = new HashSet< string >();
static string tiles;
static void recur(List< bool > vis, string ans)
{
if (ans.Length>0)
{
if (se.Contains(ans))
{
return ;
}
se.Add(ans);
}
for ( int i = 0; i < tiles.Length; i++)
{
if (vis[i])
continue ;
vis[i] = true ;
recur(vis, ans + tiles[i]);
vis[i] = false ;
}
}
static void Main() {
tiles = "AAABBC" ;
string curr = "" ;
List< bool > vis = new List< bool >();
for ( int i = 0; i < tiles.Length; i++)
{
vis.Add( false );
}
recur(vis, curr);
Console.WriteLine(se.Count);
}
}
|
Javascript
<script>
function recur(vis, ans)
{
if (ans.length>0)
{
if (se.has(ans))
{
return ;
}
se.add(ans);
}
for (let i=0;i<tiles.length;i++)
{
if (vis[i])
continue ;
vis[i] = true ;
recur(vis, ans + tiles[i]);
vis[i] = false ;
}
}
let tiles = "AAABBC" ;
let curr = "" ;
let se = new Set();
let vis = new Array(tiles.length);
for (let i = 0; i < tiles.length; i++)
{
vis[i] = false ;
}
recur(vis, curr);
document.write(se.size);
</script>
|
Time complexity: O(n! * log n)
Auxiliary Space: O(n!)
Another Approach: The idea is to maintain the frequency of the characters of the string and then by choosing each character of the string increment the count by one and decrement the frequency and Recursively call for the rest of the frequencies of the characters.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
void countNumberOfStringsUtil(
vector< int >& freq, int & count)
{
for ( int i = 0; i < 26; i++) {
if (freq[i] > 0) {
freq[i]--;
count++;
countNumberOfStringsUtil(freq,count);
freq[i]++;
}
}
}
int countNumberOfStrings(string s) {
vector< int > freq(26, 0);
for ( int i = 0; i < s.size(); i++) {
freq[s[i] - 'A' ]++;
}
int count = 0;
countNumberOfStringsUtil(freq, count);
return count;
}
int main()
{
string s = "AAABBC" ;
cout << countNumberOfStrings(s);
return 0;
}
|
Java
import java.io.*;
import java.util.*;
class GFG
{
public static int count = 0 ;
public static void countNumberOfStringsUtil( int [] freq)
{
for ( int i = 0 ; i < 26 ; i++)
{
if (freq[i] > 0 )
{
freq[i]--;
count++;
countNumberOfStringsUtil(freq);
freq[i]++;
}
}
}
public static int countNumberOfStrings(String s)
{
int [] freq = new int [ 26 ];
Arrays.fill(freq, 0 );
for ( int i = 0 ; i < s.length(); i++)
{
freq[s.charAt(i) - 'A' ]++;
}
countNumberOfStringsUtil(freq);
return count;
}
public static void main (String[] args)
{
String s = "AAABBC" ;
System.out.println(countNumberOfStrings(s));
}
}
|
Python3
count = 0
def countNumberOfStringsUtil(freq,
Count):
global count
count = Count
for i in range ( 26 ):
if (freq[i] > 0 ):
freq[i] - = 1
count + = 1
countNumberOfStringsUtil(freq,
count);
freq[i] + = 1
def countNumberOfStrings(s):
global count
global freq
freq = [ 0 for i in range ( 26 )]
for i in range ( len (s)):
freq[ ord (s[i]) -
ord ( 'A' )] + = 1
countNumberOfStringsUtil(freq,
count);
return count
s = "AAABBC"
print (countNumberOfStrings(s))
|
C#
using System;
using System.Collections.Generic;
class GFG {
static int count = 0;
static void countNumberOfStringsUtil( int [] freq)
{
for ( int i = 0; i < 26; i++)
{
if (freq[i] > 0)
{
freq[i]--;
count++;
countNumberOfStringsUtil(freq);
freq[i]++;
}
}
}
public static int countNumberOfStrings( string s)
{
int [] freq = new int [26];
Array.Fill(freq, 0);
for ( int i = 0; i < s.Length; i++)
{
freq[s[i] - 'A' ]++;
}
countNumberOfStringsUtil(freq);
return count;
}
static void Main() {
string s = "AAABBC" ;
Console.Write(countNumberOfStrings(s));
}
}
|
Javascript
<script>
let count = 0;
function countNumberOfStringsUtil(freq)
{
for (let i = 0; i < 26; i++)
{
if (freq[i] > 0)
{
freq[i]--;
count++;
countNumberOfStringsUtil(freq);
freq[i]++;
}
}
}
function countNumberOfStrings(s)
{
let freq = new Array(26);
for (let i = 0; i < freq.length; i++)
{
freq[i] = 0;
}
for (let i = 0; i < s.length; i++)
{
freq[s[i].charCodeAt(0) - 'A' .charCodeAt(0)]++;
}
countNumberOfStringsUtil(freq);
return count;
}
let s = "AAABBC" ;
document.write(countNumberOfStrings(s));
</script>
|
Time complexity: O(n! * 26^n)
Auxiliary Space: O(n)
Share your thoughts in the comments
Please Login to comment...