Longest Even Length Substring such that Sum of First and Second Half is same
Given a string ‘str’ of digits, find the length of the longest substring of ‘str’, such that the length of the substring is 2k digits and sum of left k digits is equal to the sum of right k digits.
Examples :
Input: str = "123123"
Output: 6
The complete string is of even length and sum of first and second
half digits is same
Input: str = "1538023"
Output: 4
The longest substring with same first and second half sum is "5380"
Simple Solution [ O(n3) ]
A Simple Solution is to check every substring of even length. The following is the implementation of simple approach.
C++
#include<bits/stdc++.h>
using namespace std;
int findLength( char *str)
{
int n = strlen (str);
int maxlen =0;
for ( int i=0; i<n; i++)
{
for ( int j =i+1; j<n; j += 2)
{
int length = j-i+1;
int leftsum = 0, rightsum =0;
for ( int k =0; k<length/2; k++)
{
leftsum += (str[i+k]- '0' );
rightsum += (str[i+k+length/2]- '0' );
}
if (leftsum == rightsum && maxlen < length)
maxlen = length;
}
}
return maxlen;
}
int main( void )
{
char str[] = "1538023" ;
cout << "Length of the substring is "
<< findLength(str);
return 0;
}
|
C
#include<stdio.h>
#include<string.h>
int findLength( char *str)
{
int n = strlen (str);
int maxlen =0;
for ( int i=0; i<n; i++)
{
for ( int j =i+1; j<n; j += 2)
{
int length = j-i+1;
int leftsum = 0, rightsum =0;
for ( int k =0; k<length/2; k++)
{
leftsum += (str[i+k]- '0' );
rightsum += (str[i+k+length/2]- '0' );
}
if (leftsum == rightsum && maxlen < length)
maxlen = length;
}
}
return maxlen;
}
int main( void )
{
char str[] = "1538023" ;
printf ( "Length of the substring is %d" , findLength(str));
return 0;
}
|
Java
import java.io.*;
class GFG {
static int findLength(String str)
{
int n = str.length();
int maxlen = 0 ;
for ( int i = 0 ; i < n; i++)
{
for ( int j = i + 1 ; j < n; j += 2 )
{
int length = j - i + 1 ;
int leftsum = 0 , rightsum = 0 ;
for ( int k = 0 ; k < length/ 2 ; k++)
{
leftsum += (str.charAt(i + k) - '0' );
rightsum += (str.charAt(i + k + length/ 2 ) - '0' );
}
if (leftsum == rightsum && maxlen < length)
maxlen = length;
}
}
return maxlen;
}
public static void main(String[] args)
{
String str = "1538023" ;
System.out.println( "Length of the substring is "
+ findLength(str));
}
}
|
Python3
def findLength( str ):
n = len ( str )
maxlen = 0
for i in range ( 0 , n):
for j in range (i + 1 , n, 2 ):
length = j - i + 1
leftsum = 0
rightsum = 0
for k in range ( 0 , int (length / 2 )):
leftsum + = ( int ( str [i + k]) - int ( '0' ))
rightsum + = ( int ( str [i + k + int (length / 2 )]) - int ( '0' ))
if (leftsum = = rightsum and maxlen < length):
maxlen = length
return maxlen
str = "1538023"
print ( "Length of the substring is" ,
findLength( str ))
|
C#
using System;
class GFG {
static int findLength(String str)
{
int n = str.Length;
int maxlen = 0;
for ( int i = 0; i < n; i++)
{
for ( int j = i + 1; j < n; j += 2)
{
int length = j - i + 1;
int leftsum = 0, rightsum = 0;
for ( int k = 0; k < length/2; k++)
{
leftsum += (str[i + k] - '0' );
rightsum += (str[i + k + length/2] - '0' );
}
if (leftsum == rightsum &&
maxlen < length)
maxlen = length;
}
}
return maxlen;
}
public static void Main()
{
String str = "1538023" ;
Console.Write( "Length of the substring is " +
findLength(str));
}
}
|
PHP
<?php
function findLength( $str )
{
$n = strlen ( $str );
$maxlen = 0;
for ( $i = 0; $i < $n ; $i ++)
{
for ( $j = $i + 1; $j < $n ; $j += 2)
{
$length = $j - $i + 1;
$leftsum = 0;
$rightsum = 0;
for ( $k = 0; $k < $length / 2; $k ++)
{
$leftsum += ( $str [ $i + $k ] - '0' );
$rightsum += ( $str [ $i + $k +
$length / 2] - '0' );
}
if ( $leftsum == $rightsum &&
$maxlen < $length )
$maxlen = $length ;
}
}
return $maxlen ;
}
$str = "1538023" ;
echo ( "Length of the substring is " );
echo (findLength( $str ));
?>
|
Javascript
<script>
function findLength(str)
{
let n = str.length;
let maxlen = 0;
for (let i = 0; i < n; i++)
{
for (let j = i + 1; j < n; j += 2)
{
let length = j - i + 1;
let leftsum = 0, rightsum = 0;
for (let k = 0; k < Math.floor(length/2); k++)
{
leftsum += (str[i+k] - '0' );
rightsum += (str[i+k+Math.floor(length/2)] - '0' );
}
if (leftsum == rightsum && maxlen < length)
maxlen = length;
}
}
return maxlen;
}
let str = "1538023" ;
document.write( "Length of the substring is " + findLength(str));
</script>
|
Output
Length of the substring is 4
Dynamic Programming [ O(n2) and O(n2) extra space]
The above solution can be optimized to work in O(n2) using Dynamic Programming. The idea is to build a 2D table that stores sums of substrings. The following is the implementation of Dynamic Programming approach.
C++
#include<bits/stdc++.h>
using namespace std;
int findLength( char *str)
{
int n = strlen (str);
int maxlen = 0;
int sum[n][n];
for ( int i =0; i<n; i++)
sum[i][i] = str[i]- '0' ;
for ( int len = 2; len <= n; len++)
{
for ( int i = 0; i < n - len + 1; i++)
{
int j = i + len - 1;
int k = len / 2;
sum[i][j] = sum[i][j - k] +
sum[j - k + 1][j];
if (len % 2 == 0 &&
sum[i][j - k] == sum[(j - k + 1)][j] &&
len > maxlen)
maxlen = len;
}
}
return maxlen;
}
int main( void )
{
char str[] = "153803" ;
cout << "Length of the substring is "
<< findLength(str);
return 0;
}
|
C
#include <stdio.h>
#include <string.h>
int findLength( char *str)
{
int n = strlen (str);
int maxlen = 0;
int sum[n][n];
for ( int i =0; i<n; i++)
sum[i][i] = str[i]- '0' ;
for ( int len=2; len<=n; len++)
{
for ( int i=0; i<n-len+1; i++)
{
int j = i+len-1;
int k = len/2;
sum[i][j] = sum[i][j-k] + sum[j-k+1][j];
if (len%2 == 0 && sum[i][j-k] == sum[(j-k+1)][j]
&& len > maxlen)
maxlen = len;
}
}
return maxlen;
}
int main( void )
{
char str[] = "153803" ;
printf ( "Length of the substring is %d" , findLength(str));
return 0;
}
|
Java
import java.io.*;
class GFG {
static int findLength(String str)
{
int n = str.length();
int maxlen = 0 ;
int sum[][] = new int [n][n];
for ( int i = 0 ; i < n; i++)
sum[i][i] = str.charAt(i) - '0' ;
for ( int len = 2 ; len <= n; len++)
{
for ( int i = 0 ; i < n - len + 1 ; i++)
{
int j = i + len - 1 ;
int k = len/ 2 ;
sum[i][j] = sum[i][j-k] +
sum[j-k+ 1 ][j];
if (len % 2 == 0 && sum[i][j-k] ==
sum[(j-k+ 1 )][j] && len > maxlen)
maxlen = len;
}
}
return maxlen;
}
public static void main(String[] args)
{
String str = "153803" ;
System.out.println( "Length of the substring is "
+ findLength(str));
}
}
|
Python3
def findLength(string):
n = len (string)
maxlen = 0
Sum = [[ 0 for x in range (n)]
for y in range (n)]
for i in range ( 0 , n):
Sum [i][i] = int (string[i])
for length in range ( 2 , n + 1 ):
for i in range ( 0 , n - length + 1 ):
j = i + length - 1
k = length / / 2
Sum [i][j] = ( Sum [i][j - k] +
Sum [j - k + 1 ][j])
if (length % 2 = = 0 and
Sum [i][j - k] = = Sum [(j - k + 1 )][j] and
length > maxlen):
maxlen = length
return maxlen
if __name__ = = "__main__" :
string = "153803"
print ( "Length of the substring is" ,
findLength(string))
|
C#
using System;
class GFG {
static int findLength(String str)
{
int n = str.Length;
int maxlen = 0;
int [,] sum = new int [n, n];
for ( int i = 0; i < n; i++)
sum[i, i] = str[i] - '0' ;
for ( int len = 2; len <= n; len++)
{
for ( int i = 0; i < n - len + 1; i++)
{
int j = i + len - 1;
int k = len/2;
sum[i, j] = sum[i, j-k] +
sum[j-k+1, j];
if (len % 2 == 0 && sum[i, j-k] ==
sum[(j-k+1), j] && len > maxlen)
maxlen = len;
}
}
return maxlen;
}
public static void Main()
{
String str = "153803" ;
Console.WriteLine( "Length of the substring is "
+ findLength(str));
}
}
|
PHP
<?php
function findLength( $str )
{
$n = strlen ( $str );
$maxlen = 0;
for ( $i = 0; $i < $n ; $i ++)
$sum [ $i ][ $i ] = $str [ $i ] - '0' ;
for ( $len = 2; $len <= $n ; $len ++)
{
for ( $i = 0; $i < $n - $len + 1; $i ++)
{
$j = $i + $len - 1;
$k = $len / 2;
$sum [ $i ][ $j ] = $sum [ $i ][ $j - $k ] +
$sum [ $j - $k + 1][ $j ];
if ( $len % 2 == 0 &&
$sum [ $i ][ $j - $k ] == $sum [( $j - $k + 1)][ $j ] &&
$len > $maxlen )
$maxlen = $len ;
}
}
return $maxlen ;
}
$str = "153803" ;
echo ( "Length of the substring is " );
echo (findLength( $str ));
?>
|
Javascript
<script>
function findLength(str)
{
var n = str.length;
var maxlen = 0;
var sum = Array(n).fill(0).map(x => Array(n).fill(0));
for (i = 0; i < n; i++)
sum[i][i] = str.charAt(i).charCodeAt(0) - '0' .charCodeAt(0);
for (len = 2; len <= n; len++)
{
for (i = 0; i < n - len + 1; i++)
{
var j = i + len - 1;
var k = parseInt(len/2);
sum[i][j] = sum[i][j-k] +
sum[j-k+1][j];
if (len % 2 == 0 && sum[i][j-k] ==
sum[(j-k+1)][j] && len > maxlen)
maxlen = len;
}
}
return maxlen;
}
var str = "153803" ;
document.write( "Length of the substring is "
+ findLength(str));
</script>
|
Output
Length of the substring is 4
Time complexity of the above solution is O(n2), but it requires O(n2) extra space.
[A O(n2) and O(n) extra space solution]
The idea is to use a single dimensional array to store cumulative sum.
C++
#include<bits/stdc++.h>
using namespace std;
int findLength(string str, int n)
{
int sum[n+1];
sum[0] = 0;
for ( int i = 1; i <= n; i++)
sum[i] = (sum[i-1] + str[i-1] - '0' );
int ans = 0;
for ( int len = 2; len <= n; len += 2)
{
for ( int i = 0; i <= n-len; i++)
{
int j = i + len - 1;
if (sum[i+len/2] - sum[i] == sum[i+len] - sum[i+len/2])
ans = max(ans, len);
}
}
return ans;
}
int main()
{
string str = "123123" ;
cout << "Length of the substring is " << findLength(str, str.length());
return 0;
}
|
Java
import java.util.*;
import java.io.*;
class GFG {
static int findLength(String str, int n)
{
int sum[] = new int [ n + 1 ];
sum[ 0 ] = 0 ;
for ( int i = 1 ; i <= n; i++)
sum[i] = (sum[i- 1 ] + str.charAt(i- 1 )
- '0' );
int ans = 0 ;
for ( int len = 2 ; len <= n; len += 2 )
{
for ( int i = 0 ; i <= n-len; i++)
{
int j = i + len - 1 ;
if (sum[i+len/ 2 ] - sum[i] == sum[i+len]
- sum[i+len/ 2 ])
ans = Math.max(ans, len);
}
}
return ans;
}
public static void main(String[] args)
{
String str = "123123" ;
System.out.println( "Length of the substring is "
+ findLength(str, str.length()));
}
}
|
Python3
def findLength(string, n):
Sum = [ 0 ] * (n + 1 )
for i in range ( 1 , n + 1 ):
Sum [i] = ( Sum [i - 1 ] +
int (string[i - 1 ]))
ans = 0
for length in range ( 2 , n + 1 , 2 ):
for i in range ( 0 , n - length + 1 ):
j = i + length - 1
if ( Sum [i + length / / 2 ] -
Sum [i] = = Sum [i + length] -
Sum [i + length / / 2 ]):
ans = max (ans, length)
return ans
if __name__ = = "__main__" :
string = "123123"
print ( "Length of the substring is" ,
findLength(string, len (string)))
|
C#
using System;
class GFG {
static int findLength( string str, int n)
{
int []sum = new int [ n + 1];
sum[0] = 0;
for ( int i = 1; i <= n; i++)
sum[i] = (sum[i-1] + str[i-1]
- '0' );
int ans = 0;
for ( int len = 2; len <= n; len += 2)
{
for ( int i = 0; i <= n-len; i++)
{
if (sum[i+len/2] - sum[i] ==
sum[i+len] - sum[i+len/2])
ans = Math.Max(ans, len);
}
}
return ans;
}
public static void Main()
{
string str = "123123" ;
Console.Write( "Length of the substring"
+ " is " + findLength(str, str.Length));
}
}
|
PHP
<?php
function findLength( $str , $n )
{
$sum [ $n + 1] = array ();
$sum [0] = 0;
for ( $i = 1; $i <= $n ; $i ++)
$sum [ $i ] = ( $sum [ $i - 1] +
$str [ $i - 1] - '0' );
$ans = 0;
for ( $len = 2; $len <= $n ; $len += 2)
{
for ( $i = 0; $i <= $n - $len ; $i ++)
{
$j = $i + $len - 1;
if ( $sum [ $i + $len / 2] - $sum [ $i ] == $sum [ $i + $len ] -
$sum [ $i + $len / 2])
$ans = max( $ans , $len );
}
}
return $ans ;
}
$str = "123123" ;
echo "Length of the substring is " .
findLength( $str , strlen ( $str ));
?>
|
Javascript
<script>
function findLength(str , n)
{
var sum = Array.from({length: n+1}, (_, i) => 0);
sum[0] = 0;
for ( var i = 1; i <= n; i++)
sum[i] = (sum[i-1] + str.charAt(i-1).charCodeAt(0)
- '0' .charCodeAt(0));
var ans = 0;
for ( var len = 2; len <= n; len += 2)
{
for (i = 0; i <= n-len; i++)
{
var j = i + len - 1;
if (sum[i+parseInt(len/2)] - sum[i] == sum[i+len]
- sum[i+parseInt(len/2)])
ans = Math.max(ans, len);
}
}
return ans;
}
var str = "123123" ;
document.write( "Length of the substring is "
+ findLength(str, str.length));
</script>
|
Output
Length of the substring is 6
[A O(n2) time and O(1) extra space solution]
The idea is to consider all possible mid points (of even length substrings) and keep expanding on both sides to get and update optimal length as the sum of two sides become equal.
Below is the implementation of the above idea.
C++
#include<bits/stdc++.h>
using namespace std;
int findLength(string str, int n)
{
int ans = 0;
for ( int i = 0; i <= n-2; i++)
{
int l = i, r = i + 1;
int lsum = 0, rsum = 0;
while (r < n && l >= 0)
{
lsum += str[l] - '0' ;
rsum += str[r] - '0' ;
if (lsum == rsum)
ans = max(ans, r-l+1);
l--;
r++;
}
}
return ans;
}
int main()
{
string str = "123123" ;
cout << "Length of the substring is " << findLength(str, str.length());
return 0;
}
|
Java
import java.util.*;
import java.io.*;
class GFG {
static int findLength(String str, int n) {
int ans = 0 ;
for ( int i = 0 ; i <= n - 2 ; i++) {
int l = i, r = i + 1 ;
int lsum = 0 , rsum = 0 ;
while (r < n && l >= 0 ) {
lsum += str.charAt(l) - '0' ;
rsum += str.charAt(r) - '0' ;
if (lsum == rsum) {
ans = Math.max(ans, r - l + 1 );
}
l--;
r++;
}
}
return ans;
}
static public void main(String[] args) {
String str = "123123" ;
System.out.println( "Length of the substring is "
+ findLength(str, str.length()));
}
}
|
Python 3
def findLength(st, n):
total = [ 0 ] * (n + 1 )
for i in range ( 1 , n + 1 ):
total[i] = (total[i - 1 ] +
int (st[i - 1 ]) - int ( '0' ))
ans = 0
l = 2
while (l < = n):
for i in range (n - l + 1 ):
if (total[i + int (l / 2 )] -
total[i] = = total[i + l] -
total[i + int (l / 2 )]):
ans = max (ans, l)
l = l + 2
return ans
st = "123123"
print ( "Length of the substring is" ,
findLength(st, len (st)))
|
C#
using System;
public class GFG {
static int findLength(String str, int n) {
int ans = 0;
for ( int i = 0; i <= n - 2; i++) {
int l = i, r = i + 1;
int lsum = 0, rsum = 0;
while (r < n && l >= 0) {
lsum += str[l] - '0' ;
rsum += str[r] - '0' ;
if (lsum == rsum) {
ans = Math.Max(ans, r - l + 1);
}
l--;
r++;
}
}
return ans;
}
static public void Main() {
String str = "123123" ;
Console.Write( "Length of the substring is "
+ findLength(str, str.Length));
}
}
|
PHP
<?php
function findLength( $str , $n )
{
$ans = 0;
for ( $i = 0; $i <= $n - 2; $i ++)
{
$l = $i ;
$r = $i + 1;
$lsum = 0;
$rsum = 0;
while ( $r < $n && $l >= 0)
{
$lsum += $str [ $l ] - '0' ;
$rsum += $str [ $r ] - '0' ;
if ( $lsum == $rsum )
$ans = max( $ans , $r - $l + 1);
$l --;
$r ++;
}
}
return $ans ;
}
$str = "123123" ;
echo "Length of the substring is " .
findLength( $str , strlen ( $str ));
return 0;
?>
|
Javascript
<script>
function findLength(str,n)
{
let ans = 0;
for (let i = 0; i <= n - 2; i++) {
let l = i, r = i + 1;
let lsum = 0, rsum = 0;
while (r < n && l >= 0) {
lsum += str.charAt(l) - '0' ;
rsum += str.charAt(r) - '0' ;
if (lsum == rsum) {
ans = Math.max(ans, r - l + 1);
}
l--;
r++;
}
}
return ans;
}
let str= "123123" ;
document.write( "Length of the substring is "
+ findLength(str, str.length));
</script>
|
Output
Length of the substring is 6
Last Updated :
20 Dec, 2022
Like Article
Save Article
Share your thoughts in the comments
Please Login to comment...