Given a numeric string (length <= 32), split it into two or more integers( if possible), such that
- Difference between current and previous number is 1.
- No number contains leading zeroes
If it is possible to separate a given numeric string then print “Possible” followed by the first number of the increasing sequence, else print “Not Possible“.
Examples:
Input : 1234
Output : Possible 1
Explanation: String can be split as "1", "2",
"3", "4"
Input : 99100
Output :Possible 99
Explanation: String can be split as "99",
"100"
Input : 101103
Output : Not Possible
Explanation: It is not possible to split this
string under given constraint.
Approach : The idea is to take a substring from index 0 to any index i (i starting from 1) of the numeric string and convert it to long data type. Add 1 to it and convert the increased number back to string. Check if the next occurring substring is equal to the increased one. If yes, then carry on the procedure else increase the value of i and repeat the steps.
Implementation:
C++
#include <bits/stdc++.h>
using namespace std;
void split(string str)
{
int len = str.length();
if (len == 1) {
cout << ( "Not Possible" );
return ;
}
string s1 = "" , s2 = "" ;
long num1, num2;
for ( int i = 0; i <= len / 2; i++) {
int flag = 0;
s1 = str.substr(0, i + 1);
num1 = stoi((s1));
num2 = num1 + 1;
s2 = to_string(num2);
int k = i + 1;
while (flag == 0) {
int l = s2.length();
if (k + l > len) {
flag = 1;
break ;
}
if ((str.substr(k, k + l) == s2)) {
flag = 0;
num2++;
k = k + l;
if (k == len)
break ;
s2 = to_string(num2);
l = s2.length();
if (k + 1 > len) {
flag = 1;
break ;
}
}
else
flag = 1;
}
if (flag == 0) {
cout << "Possible " << s1 << endl;
break ;
}
else if (flag == 1 && i > len / 2 - 1) {
cout << "Not Possible" << endl;
break ;
}
}
}
int main()
{
string str = "99100" ;
split(str);
return 0;
}
|
Java
import java.io.*;
import java.util.*;
class GFG {
public static void split(String str)
{
int len = str.length();
if (len == 1 ) {
System.out.println( "Not Possible" );
return ;
}
String s1 = "" , s2 = "" ;
long num1, num2;
for ( int i = 0 ; i <= len / 2 ; i++) {
int flag = 0 ;
s1 = str.substring( 0 , i + 1 );
num1 = Long.parseLong((s1));
num2 = num1 + 1 ;
s2 = Long.toString(num2);
int k = i + 1 ;
while (flag == 0 ) {
int l = s2.length();
if (k + l > len) {
flag = 1 ;
break ;
}
if ((str.substring(k, k + l).equals(s2))) {
flag = 0 ;
num2++;
k = k + l;
if (k == len)
break ;
s2 = Long.toString(num2);
l = s2.length();
if (k + 1 > len) {
flag = 1 ;
break ;
}
}
else
flag = 1 ;
}
if (flag == 0 ) {
System.out.println( "Possible"
+ " " + s1);
break ;
}
else if (flag == 1 && i > len / 2 - 1 ) {
System.out.println( "Not Possible" );
break ;
}
}
}
public static void main(String args[])
{
Scanner in = new Scanner(System.in);
String str = "99100" ;
split(str);
}
}
|
Python3
def split( Str ) :
Len = len ( Str )
if ( Len = = 1 ) :
print ( "Not Possible" )
return
s1, s2 = " ", " "
for i in range (( Len / / 2 ) + 1 ) :
flag = 0
s1 = Str [ 0 : i + 1 ]
num1 = int (s1)
num2 = num1 + 1
s2 = str (num2)
k = i + 1
while (flag = = 0 ) :
l = len (s2)
if (k + l > Len ) :
flag = 1
break
if (( Str [k : k + l] = = s2)) :
flag = 0
num2 + = 1
k = k + l
if (k = = Len ) :
break
s2 = str (num2)
l = len (s2)
if (k + 1 > len ) :
flag = 1
break
else :
flag = 1
if (flag = = 0 ) :
print ( "Possible" , s1)
break
elif (flag = = 1 and i > ( Len / / 2 ) - 1 ) :
print ( "Not Possible" )
break
Str = "99100"
split( Str )
|
C#
using System;
class GFG
{
static void split( string str)
{
int len = str.Length;
if (len == 1)
{
Console.WriteLine( "Not Possible" );
return ;
}
string s1 = "" , s2 = "" ;
long num1, num2;
for ( int i = 0; i < len / 2; i++)
{
int flag = 0;
s1 = str.Substring(0, i + 1);
num1 = Convert.ToInt64((s1));
num2 = num1 + 1;
s2 = num2.ToString();
int k = i + 1;
while (flag == 0)
{
int l = s2.Length;
if (k + l > len)
{
flag = 1;
break ;
}
if ((str.Substring(k, l).Equals(s2)))
{
flag = 0;
num2++;
k = k + l;
if (k == len)
break ;
s2 = num2.ToString();
l = s2.Length;
if (k + 1 > len)
{
flag = 1;
break ;
}
}
else
flag = 1;
}
if (flag == 0)
{
Console.WriteLine( "Possible" +
" " + s1);
break ;
}
else if (flag == 1 &&
i > len / 2 - 1)
{
Console.WriteLine( "Not Possible" );
break ;
}
}
}
static void Main()
{
string str = "99100" ;
split(str);
}
}
|
Javascript
<script>
function split(str)
{
let len = str.length;
if (len == 1) {
document.write( "Not Possible" , "</br>" );
return ;
}
let s1 = "" , s2 = "" ;
let num1, num2;
for (let i = 0; i <= Math.floor(len / 2); i++) {
let flag = 0;
s1 = str.substring(0, i + 1);
num1 = parseInt(s1);
num2 = num1 + 1;
s2 = num2.toString(10);
let k = i + 1;
while (flag == 0) {
let l = s2.length;
if (k + l > len) {
flag = 1;
break ;
}
if (str.substring(k, 2*k + l) == s2) {
flag = 0;
num2++;
k = k + l;
if (k == len)
break ;
s2 = num2.toString(10);
l = s2.length;
if (k + 1 > len) {
flag = 1;
break ;
}
}
else flag = 1;
}
if (flag == 0) {
document.write( "Possible " + s1, "</br>" );
break ;
}
else if (flag == 1 && i > Math.floor(len / 2)- 1) {
document.write( "Not Possible" , "</br>" );
break ;
}
}
}
let str = "99100" ;
split(str);
</script>
|
Time Complexity: O(n*n), where n is the length of string.
Auxiliary Space: O(n), where n is the length of string.
Feeling lost in the world of random DSA topics, wasting time without progress? It's time for a change! Join our DSA course, where we'll guide you on an exciting journey to master DSA efficiently and on schedule.
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 geeks!