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++
// C++ program for the above approach#include <bits/stdc++.h>using namespace std;// Function to find the length of the// longest non-increasing subsequenceint findLength(string str, int n){ // Stores the prefix and suffix // count of 1s and 0s respectively int pre[n], post[n]; // Initialize the array memset(pre, 0, sizeof(pre)); memset(post, 0, sizeof(post)); // Store the number of '1's // up to current index i in pre for (int i = 0; i < n; i++) { // Find the prefix sum if (i != 0) { pre[i] += pre[i - 1]; } // If the current element // is '1', update the pre[i] if (str[i] == '1') { pre[i] += 1; } } // Store the number of '0's over // the range [i, N - 1] for (int i = n - 1; i >= 0; i--) { // Find the suffix sum if (i != n - 1) post[i] += post[i + 1]; // If the current element // is '0', update post[i] if (str[i] == '0') post[i] += 1; } // Stores the maximum length int ans = 0; // Find the maximum value of // pre[i] + post[i] for (int i = 0; i < n; i++) { ans = max(ans, pre[i] + post[i]); } // Return the answer return ans;}// Driver Codeint main(){ string S = "0101110110100001011"; cout << findLength(S, S.length()); return 0;} |
Java
// Java program for the above approachclass GFG{// Function to find the length of the// longest non-increasing subsequencestatic int findLength(String str, int n){ // Stores the prefix and suffix // count of 1s and 0s respectively int pre[] = new int[n]; int post[] = new int[n]; // Initialize the array for(int i = 0; i < n; i++) { pre[i] = 0; post[i] = 0; } // Store the number of '1's // up to current index i in pre for(int i = 0; i < n; i++) { // Find the prefix sum if (i != 0) { pre[i] += pre[i - 1]; } // If the current element // is '1', update the pre[i] if (str.charAt(i) == '1') { pre[i] += 1; } } // Store the number of '0's over // the range [i, N - 1] for(int i = n - 1; i >= 0; i--) { // Find the suffix sum if (i != n - 1) post[i] += post[i + 1]; // If the current element // is '0', update post[i] if (str.charAt(i) == '0') post[i] += 1; } // Stores the maximum length int ans = 0; // Find the maximum value of // pre[i] + post[i] for(int i = 0; i < n; i++) { ans = Math.max(ans, pre[i] + post[i]); } // Return the answer return ans;}// Driver Codepublic static void main(String[] args){ String S = "0101110110100001011"; System.out.println(findLength(S, S.length()));}}// This code is contributed by abhinavjain194 |
Python3
# Python3 program for the above approach# Function to find the length of the# longest non-increasing subsequencedef findLength(str, n): # Stores the prefix and suffix # count of 1s and 0s respectively pre = [0] * n post = [0] * n # Store the number of '1's # up to current index i in pre for i in range(n): # Find the prefix sum if (i != 0): pre[i] += pre[i - 1] # If the current element # is '1', update the pre[i] if (str[i] == '1'): pre[i] += 1 # Store the number of '0's over # the range [i, N - 1] for i in range(n - 1, -1, -1): # Find the suffix sum if (i != (n - 1)): post[i] += post[i + 1] # If the current element # is '0', update post[i] if (str[i] == '0'): post[i] += 1 # Stores the maximum length ans = 0 # Find the maximum value of # pre[i] + post[i] for i in range(n): ans = max(ans, pre[i] + post[i]) # Return the answer return ans# Driver CodeS = "0101110110100001011"n = len(S)print(findLength(S, n))# This code is contributed by susmitakundugoaldanga |
C#
// C# program for the above approachusing System;class GFG{// Function to find the length of the// longest non-increasing subsequencestatic int findLength(String str, int n){ // Stores the prefix and suffix // count of 1s and 0s respectively int []pre = new int[n]; int []post = new int[n]; // Initialize the array for(int i = 0; i < n; i++) { pre[i] = 0; post[i] = 0; } // Store the number of '1's // up to current index i in pre for(int i = 0; i < n; i++) { // Find the prefix sum if (i != 0) { pre[i] += pre[i - 1]; } // If the current element // is '1', update the pre[i] if (str[i] == '1') { pre[i] += 1; } } // Store the number of '0's over // the range [i, N - 1] for(int i = n - 1; i >= 0; i--) { // Find the suffix sum if (i != n - 1) post[i] += post[i + 1]; // If the current element // is '0', update post[i] if (str[i] == '0') post[i] += 1; } // Stores the maximum length int ans = 0; // Find the maximum value of // pre[i] + post[i] for(int i = 0; i < n; i++) { ans = Math.Max(ans, pre[i] + post[i]); } // Return the answer return ans;}// Driver Codepublic static void Main(String[] args){ String S = "0101110110100001011"; Console.WriteLine(findLength(S, S.Length));}}// This code is contributed by Princi Singh |
Javascript
<script>// Javascript program for the above approach// Function to find the length of the// longest non-increasing subsequencefunction findLength(str, n){ // Stores the prefix and suffix // count of 1s and 0s respectively let pre = Array.from({length: n}, (_, i) => 0); let post = Array.from({length: n}, (_, i) => 0); // Initialize the array for(let i = 0; i < n; i++) { pre[i] = 0; post[i] = 0; } // Store the number of '1's // up to current index i in pre for(let i = 0; i < n; i++) { // Find the prefix sum if (i != 0) { pre[i] += pre[i - 1]; } // If the current element // is '1', update the pre[i] if (str[i] == '1') { pre[i] += 1; } } // Store the number of '0's over // the range [i, N - 1] for(let i = n - 1; i >= 0; i--) { // Find the suffix sum if (i != n - 1) post[i] += post[i + 1]; // If the current element // is '0', update post[i] if (str[i] == '0') post[i] += 1; } // Stores the maximum length let ans = 0; // Find the maximum value of // pre[i] + post[i] for(let i = 0; i < n; i++) { ans = Math.max(ans, pre[i] + post[i]); } // Return the answer return ans;}// Driver Code let S = "0101110110100001011"; document.write(findLength(S, S.length)); </script> |
12
Time Complexity: O(N)
Auxiliary Space: O(N)
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 neveropen!
