Longest Non-Increasing Subsequence in a Binary String
Given a binary string S of size N, the task is to find the length of the longest non-increasing subsequence in the given string S.
Examples:
Input: S = “0101110110100001011”
Output: 12
Explanation: The longest non-increasing subsequence is “111111100000”, having length equal to 12.
Input: S = 10101
Output: 3
Approach: The given problem can be solved based on the observation that the string S is a binary string, so a non-increasing subsequence will always consist of 0 with more consecutive 1s or 1 with more consecutive 0s. Follow the steps below to solve the problem:
- Initialize an array, say pre[], that stores the number of 1s till each index i for i is over the range [0, N – 1].
- Initialize an array, say post[], that stores the number of 0s till each index i to the end of the string for i over the range [0, N – 1].
- Initialize a variable, say ans that stores the length of the longest non-increasing subsequence in the given string S.
- Iterate over the range [0, N – 1] and update the value of ans to the maximum of ans and (pre[i] + post[i]).
- After completing the above steps, print the value of ans as the result.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
int findLength(string str, int n)
{
int pre[n], post[n];
memset (pre, 0, sizeof (pre));
memset (post, 0, sizeof (post));
for ( int i = 0; i < n; i++) {
if (i != 0) {
pre[i] += pre[i - 1];
}
if (str[i] == '1' ) {
pre[i] += 1;
}
}
for ( int i = n - 1; i >= 0; i--) {
if (i != n - 1)
post[i] += post[i + 1];
if (str[i] == '0' )
post[i] += 1;
}
int ans = 0;
for ( int i = 0; i < n; i++) {
ans = max(ans, pre[i] + post[i]);
}
return ans;
}
int main()
{
string S = "0101110110100001011" ;
cout << findLength(S, S.length());
return 0;
}
|
Java
class GFG{
static int findLength(String str, int n)
{
int pre[] = new int [n];
int post[] = new int [n];
for ( int i = 0 ; i < n; i++)
{
pre[i] = 0 ;
post[i] = 0 ;
}
for ( int i = 0 ; i < n; i++)
{
if (i != 0 )
{
pre[i] += pre[i - 1 ];
}
if (str.charAt(i) == '1' )
{
pre[i] += 1 ;
}
}
for ( int i = n - 1 ; i >= 0 ; i--)
{
if (i != n - 1 )
post[i] += post[i + 1 ];
if (str.charAt(i) == '0' )
post[i] += 1 ;
}
int ans = 0 ;
for ( int i = 0 ; i < n; i++)
{
ans = Math.max(ans, pre[i] + post[i]);
}
return ans;
}
public static void main(String[] args)
{
String S = "0101110110100001011" ;
System.out.println(findLength(S, S.length()));
}
}
|
Python3
def findLength( str , n):
pre = [ 0 ] * n
post = [ 0 ] * n
for i in range (n):
if (i ! = 0 ):
pre[i] + = pre[i - 1 ]
if ( str [i] = = '1' ):
pre[i] + = 1
for i in range (n - 1 , - 1 , - 1 ):
if (i ! = (n - 1 )):
post[i] + = post[i + 1 ]
if ( str [i] = = '0' ):
post[i] + = 1
ans = 0
for i in range (n):
ans = max (ans, pre[i] + post[i])
return ans
S = "0101110110100001011"
n = len (S)
print (findLength(S, n))
|
C#
using System;
class GFG{
static int findLength(String str, int n)
{
int []pre = new int [n];
int []post = new int [n];
for ( int i = 0; i < n; i++)
{
pre[i] = 0;
post[i] = 0;
}
for ( int i = 0; i < n; i++)
{
if (i != 0)
{
pre[i] += pre[i - 1];
}
if (str[i] == '1' )
{
pre[i] += 1;
}
}
for ( int i = n - 1; i >= 0; i--)
{
if (i != n - 1)
post[i] += post[i + 1];
if (str[i] == '0' )
post[i] += 1;
}
int ans = 0;
for ( int i = 0; i < n; i++)
{
ans = Math.Max(ans, pre[i] + post[i]);
}
return ans;
}
public static void Main(String[] args)
{
String S = "0101110110100001011" ;
Console.WriteLine(findLength(S, S.Length));
}
}
|
Javascript
<script>
function findLength(str, n)
{
let pre = Array.from({length: n}, (_, i) => 0);
let post = Array.from({length: n}, (_, i) => 0);
for (let i = 0; i < n; i++)
{
pre[i] = 0;
post[i] = 0;
}
for (let i = 0; i < n; i++)
{
if (i != 0)
{
pre[i] += pre[i - 1];
}
if (str[i] == '1' )
{
pre[i] += 1;
}
}
for (let i = n - 1; i >= 0; i--)
{
if (i != n - 1)
post[i] += post[i + 1];
if (str[i] == '0' )
post[i] += 1;
}
let ans = 0;
for (let i = 0; i < n; i++)
{
ans = Math.max(ans, pre[i] + post[i]);
}
return ans;
}
let S = "0101110110100001011" ;
document.write(findLength(S, S.length));
</script>
|
Time Complexity: O(N)
Auxiliary Space: O(N)
Last Updated :
21 May, 2021
Like Article
Save Article
Share your thoughts in the comments
Please Login to comment...