Given string str that represents a number. The task is to find all possible ways to split the given string such that each segment is a prime number in the range of 1 to 106.
Examples:
Input: str = “3175”
Output:
[317, 5]
[31, 7, 5]
[3, 17, 5]
Explanation:
There can be 8 possible ways to split:
[3175]
[317, 5] – All primes
[31, 75]
[31, 7, 5] – All primes
[3, 175]
[3, 17, 5] – All primes
[3, 1, 75]
[3, 1, 7, 5]
Input: str = “11373”
Output:
[113, 73]
[113, 7, 3]
[11, 373]
[11, 37, 3]
[11, 3, 73]
[11, 3, 7, 3]
Approach:
- The idea is to generate all possible splits of a string of size N by counting binary numbers from 0 to 2(N – 1) – 1. Where every 1 indicates that the string should split at that point.
For example:
S = "3175" 0 0 0 3175 0 0 1 317, 5 0 1 0 31, 75 0 1 1 31, 7, 5 1 0 0 3, 175 1 0 1 3, 17, 5 1 1 0 3, 1, 75 1 1 1 3, 1, 7, 5
- To check the prime number efficiently we will pre-process prime number in a boolean array using Sieve of Eratosthenes.
Below is the implementation of the above approach.
C++
// C++ program to Find all the // ways to split the given string // into Primes. #include<bits/stdc++.h> using namespace std;
bool primes[1000000];
const int maxn = 1000000;
// Sieve of Eratosthenes void sieve()
{ memset (primes, true , sizeof (primes));
primes[0] = primes[1] = 0;
for ( int i = 2; i * i <= maxn; i++)
{
if (primes[i])
{
for ( int j = i * i ;
j <= maxn ; j += i)
primes[j] = false ;
}
}
} // Function Convert integer // to binary string string toBinary( int n)
{ string r = "" ;
while (n != 0)
{
r = (n % 2 == 0 ? "0" : "1" ) + r;
n /= 2;
}
return (r == "" )? "0" :r;
} // Function print all the // ways to split the given string // into Primes. void PrimeSplit(string str)
{ string temp;
int cnt=0;
// To store all possible strings
vector<string> ans;
int bt = 1<<(str.size()-1);
int n = str.size();
// Exponetnital complexity n*(2^(n-1))
// for bit
for ( int i = 0 ; i < bt ; i++)
{
temp = toBinary(i) + "0" ;
int j = 0, x = n - temp.size(), y;
while (j < x)
{
temp = "0" + temp;
j++;
}
j = 0;
x = 0;
y = -1;
string sp = "" , tp = "" ;
bool flag = 0;
while (j < n)
{
sp += str[j];
if (temp[j] == '1' )
{
tp += sp + ',' ;
y = stoi(sp);
// Pruning step
if (!primes[y])
{
flag = 1;
break ;
}
sp = "" ;
}
j++;
}
tp += sp;
if (sp != "" )
{
y = stoi(sp);
if (!primes[y])
flag = 1;
}
if (!flag)
ans.push_back(tp);
}
if (ans.size() == 0)
{
cout << -1 << endl;
}
for ( auto i:ans)
{
cout << i << endl;
}
} // Driver code int main()
{ string str = "11373" ;
sieve();
PrimeSplit(str);
return 0;
} |
Java
// Java program to Find all the // ways to split the given string // into Primes. import java.util.*;
import java.lang.*;
class GFG{
static boolean [] primes = new boolean [ 1000001 ];
static int maxn = 1000000 ;
// Sieve of Eratosthenes static void sieve()
{ Arrays.fill(primes, true );
primes[ 0 ] = false ;
primes[ 1 ] = false ;
for ( int i = 2 ; i * i <= maxn; i++)
{
if (primes[i])
{
for ( int j = i * i;
j <= maxn; j += i)
primes[j] = false ;
}
}
} // Function Convert integer // to binary string static String toBinary( int n)
{ String r = "" ;
while (n != 0 )
{
r = (n % 2 == 0 ? "0" : "1" ) + r;
n /= 2 ;
}
return (r == "" ) ? "0" : r;
} // Function print all the // ways to split the given string // into Primes. static void PrimeSplit(String str)
{ String temp;
int cnt = 0 ;
// To store all possible strings
ArrayList<String> ans = new ArrayList<>();
int bt = 1 << (str.length() - 1 );
int n = str.length();
// Exponetnital complexity n*(2^(n-1))
// for bit
for ( int i = 0 ; i < bt; i++)
{
temp = toBinary(i) + "0" ;
int j = 0 , x = n - temp.length(), y;
while (j < x)
{
temp = "0" + temp;
j++;
}
j = 0 ;
x = 0 ;
y = - 1 ;
String sp = "" , tp = "" ;
boolean flag = false ;
while (j < n)
{
sp += str.charAt(j);
if (temp.charAt(j) == '1' )
{
tp += sp + ',' ;
y = Integer.parseInt(sp);
// Pruning step
if (!primes[y])
{
flag = true ;
break ;
}
sp = "" ;
}
j++;
}
tp += sp;
if (sp != "" )
{
y = Integer.parseInt(sp);
if (!primes[y])
flag = true ;
}
if (!flag)
ans.add(tp);
}
if (ans.size() == 0 )
{
System.out.println(- 1 );
}
for (String i : ans)
{
System.out.println(i);
}
} // Driver Code public static void main (String[] args)
{ String str = "11373" ;
sieve();
PrimeSplit(str);
} } // This code is contributed by offbeat |
Python3
# Python 3 program to Find all the # ways to split the given string # into Primes. primes = [ True ] * 1000001
maxn = 1000000
# Sieve of Eratosthenes def sieve():
primes[ 0 ] = primes[ 1 ] = 0 i = 2
while i * i < = maxn:
if (primes[i]):
for j in range (i * i,
maxn + 1 , i):
primes[j] = False
i + = 1
# Function Convert integer # to binary string def toBinary(n):
r = ""
while (n ! = 0 ):
if (n % 2 = = 0 ):
r = "0" + r
else :
r = "1" + r
n / / = 2
if (r = = ""):
return "0"
return r
# Function print all the # ways to split the given string # into Primes. def PrimeSplit(st):
cnt = 0
# To store all
# possible strings
ans = []
bt = 1 << ( len (st) - 1 )
n = len (st)
# Exponetnital complexity
# n*(2^(n-1)) for bit
for i in range (bt):
temp = toBinary(i) + "0"
j = 0
x = n - len (temp)
while (j < x):
temp = "0" + temp
j + = 1
j = 0
x = 0
y = - 1
sp = ""
tp = ""
flag = 0
while (j < n):
sp + = st[j]
if (temp[j] = = '1' ):
tp + = sp + ','
y = int (sp)
# Pruning step
if ( not primes[y]):
flag = 1
break
sp = ""
j + = 1
tp + = sp
if (sp ! = ""):
y = int (sp)
if ( not primes[y]):
flag = 1
if ( not flag):
ans.append(tp)
if ( len (ans) = = 0 ):
print ( - 1 )
for i in ans:
print (i)
# Driver code if __name__ = = "__main__" :
st = "11373"
sieve()
PrimeSplit(st)
# This code is contributed by Chitranayal |
C#
// C# program to Find all the // ways to split the given string // into Primes. using System;
using System.Collections.Generic;
class GFG{
static bool [] primes =
new bool [1000001];
static int maxn = 1000000;
// Sieve of Eratosthenes static void sieve()
{ for ( int i = 0;
i < primes.Length; i++)
{
primes[i] = true ;
}
primes[0] = false ;
primes[1] = false ;
for ( int i = 2; i * i <= maxn; i++)
{
if (primes[i])
{
for ( int j = i * i;
j <= maxn; j += i)
primes[j] = false ;
}
}
} // Function Convert integer // to binary string static String toBinary( int n)
{ String r = "" ;
while (n != 0)
{
r = (n % 2 == 0 ?
"0" : "1" ) + r;
n /= 2;
}
return (r == "" ) ? "0" : r;
} // Function print all the // ways to split the given string // into Primes. static void PrimeSplit(String str)
{ String temp;
// To store all possible strings
List<String> ans = new List<String>();
int bt = 1 << (str.Length - 1);
int n = str.Length;
// Exponetnital complexity
// n*(2^(n-1)) for bit
for ( int i = 0; i < bt; i++)
{
temp = toBinary(i) + "0" ;
int j = 0, x = n - temp.Length, y;
while (j < x)
{
temp = "0" + temp;
j++;
}
j = 0;
x = 0;
y = -1;
String sp = "" , tp = "" ;
bool flag = false ;
while (j < n)
{
sp += str[j];
if (temp[j] == '1' )
{
tp += sp + ',' ;
y = Int32.Parse(sp);
// Pruning step
if (!primes[y])
{
flag = true ;
break ;
}
sp = "" ;
}
j++;
}
tp += sp;
if (sp != "" )
{
y = Int32.Parse(sp);
if (!primes[y])
flag = true ;
}
if (!flag)
ans.Add(tp);
}
if (ans.Count == 0)
{
Console.WriteLine(-1);
}
foreach (String i in ans)
{
Console.WriteLine(i);
}
} // Driver Code public static void Main(String[] args)
{ String str = "11373" ;
sieve();
PrimeSplit(str);
} } // This code is contributed by Rajput-Ji |
Javascript
<script> // Javascript program to Find all the // ways to split the given string // into Primes. let primes = new Array(1000000);
const maxn = 1000000; // Sieve of Eratosthenes function sieve()
{ primes.fill( true )
primes[0] = primes[1] = 0;
for (let i = 2; i * i <= maxn; i++)
{
if (primes[i])
{
for (let j = i * i ;
j <= maxn ; j += i)
primes[j] = false ;
}
}
} // Function Convert integer // to binary string function toBinary(n)
{ let r = "" ;
while (n != 0)
{
r = (n % 2 == 0 ? "0" : "1" ) + r;
n = Math.floor(n / 2);
}
return (r == "" )? "0" :r;
} // Function print all the // ways to split the given string // into Primes. function PrimeSplit(str)
{ let temp;
let cnt=0;
// To store all possible strings
let ans = new Array();
let bt = 1 << (str.length-1);
let n = str.length;
// Exponetnital complexity n*(2^(n-1))
// for bit
for (let i = 0 ; i < bt ; i++)
{
temp = toBinary(i) + "0" ;
let j = 0, x = n - temp.length, y;
while (j < x)
{
temp = "0" + temp;
j++;
}
j = 0;
x = 0;
y = -1;
let sp = "" , tp = "" ;
let flag = 0;
while (j < n)
{
sp += str[j];
if (temp[j] == '1' )
{
tp += sp + ',' ;
y = parseInt(sp);
// Pruning step
if (!primes[y])
{
flag = 1;
break ;
}
sp = "" ;
}
j++;
}
tp += sp;
if (sp != "" )
{
y = parseInt(sp);
if (!primes[y])
flag = 1;
}
if (!flag)
ans.push(tp);
}
if (ans.length == 0)
{
document.write(-1 + "<br>" );
}
for (let i of ans)
{
document.write(i + "<br>" );
}
} // Driver code let str = "11373" ;
sieve(); PrimeSplit(str); // This code is contributed by _saurabh_jaiswal </script> |
Output:
113,73 113,7,3 11,373 11,37,3 11,3,73 11,3,7,3