Given a numeric string S, the task is to find the maximum length of a subsequence having its left rotation equal to its right rotation.
Examples:
Input: S = “100210601”
Output: 4
Explanation:
The subsequence “0000” satisfies the necessary condition.
The subsequence “1010” generates the string “0101” on left rotation and string “0101” on right rotation. Since both the rotations are same. Therefore, “1010” satisfies the condition as well.
Therefore, the maximum length of such subsequence is 4.
Input: S = “252525”
Output: 6
Explanation:
The subsequence “252525” generates the string “525252” on left rotation and string “525252” on right rotation. Since both the rotations are same. Therefore, the “252525” satisfies the required condition.
Naive Approach: The simplest approach to solve the problem is to generate all possible subsequences of the given string, and for each subsequence, check if its left rotation is equal to its right rotation.
Time Complexity: O(2N * N)
Auxiliary Space: O(N)
Efficient Approach: To optimize the above approach, the main observation is that the subsequence should either consist of a single character or should be of even length consisting of two characters alternatively.
Illustration:
str = “2424”
Left rotation of the string = “4242”
Right rotation of the string = “4242”
As we can see, since the number is of even length having two characters appearing alternately, therefore, the left and right rotation of the given number is equal.
str = “24242”
Left rotation of the string = “42422”
Right rotation of the string = “22424”
As we can see, since the number is of odd length having two characters appearing alternately, therefore, the left and right rotation of the given number is not equal.
Follow the steps below to solve the problem:
- Generate all possible two-digit numbers.
- For each two-digit number generated, check for the alternating occurrence of both the digits in the string. Keep incrementing count to store the length of alternating subsequence for the particular combination.
- After the entire traversal of the string, check if both the digits are equal or not. If found to be true, update count to the required answer. If both the digits are equal, then update count or count – 1 to the answer if the count is even or odd respectively.
- Repeat the above steps for all the possible combinations and print the maximum count obtained.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
int findAltSubSeq(string s)
{
int n = s.size(), ans = INT_MIN;
for ( int i = 0; i < 10; i++) {
for ( int j = 0; j < 10; j++) {
int cur = 0, f = 0;
for ( int k = 0; k < n; k++) {
if (f == 0 and s[k] - '0' == i) {
f = 1;
cur++;
}
else if (f == 1 and s[k] - '0' == j) {
f = 0;
cur++;
}
}
if (i != j and cur % 2 == 1)
cur--;
ans = max(cur, ans);
}
}
return ans;
}
int main()
{
string s = "100210601" ;
cout << findAltSubSeq(s);
return 0;
}
|
Java
import java.util.*;
class GFG{
static int findAltSubSeq(String s)
{
int n = s.length(), ans = Integer.MIN_VALUE;
for ( int i = 0 ; i < 10 ; i++)
{
for ( int j = 0 ; j < 10 ; j++)
{
int cur = 0 , f = 0 ;
for ( int k = 0 ; k < n; k++)
{
if (f == 0 && s.charAt(k) - '0' == i)
{
f = 1 ;
cur++;
}
else if (f == 1 &&
s.charAt(k) - '0' == j)
{
f = 0 ;
cur++;
}
}
if (i != j && cur % 2 == 1 )
cur--;
ans = Math.max(cur, ans);
}
}
return ans;
}
public static void main(String[] args)
{
String s = "100210601" ;
System.out.print(findAltSubSeq(s));
}
}
|
Python3
import sys
def findAltSubSeq(s):
n = len (s)
ans = - sys.maxsize - 1
for i in range ( 10 ):
for j in range ( 10 ):
cur, f = 0 , 0
for k in range (n):
if (f = = 0 and ord (s[k]) -
ord ( '0' ) = = i):
f = 1
cur + = 1
elif (f = = 1 and ord (s[k]) -
ord ( '0' ) = = j):
f = 0
cur + = 1
if i ! = j and cur % 2 = = 1 :
cur - = 1
ans = max (cur, ans)
return ans
s = "100210601"
print (findAltSubSeq(s))
|
C#
using System;
class GFG{
static int findAltSubSeq(String s)
{
int n = s.Length, ans = int .MinValue;
for ( int i = 0; i < 10; i++)
{
for ( int j = 0; j < 10; j++)
{
int cur = 0, f = 0;
for ( int k = 0; k < n; k++)
{
if (f == 0 && s[k] - '0' == i)
{
f = 1;
cur++;
}
else if (f == 1 &&
s[k] - '0' == j)
{
f = 0;
cur++;
}
}
if (i != j && cur % 2 == 1)
cur--;
ans = Math.Max(cur, ans);
}
}
return ans;
}
public static void Main(String[] args)
{
String s = "100210601" ;
Console.Write(findAltSubSeq(s));
}
}
|
Javascript
<script>
function findAltSubSeq(s)
{
var n = s.length, ans = -1000000000;
for ( var i = 0; i < 10; i++) {
for ( var j = 0; j < 10; j++) {
var cur = 0, f = 0;
for ( var k = 0; k < n; k++) {
if (f == 0 && s[k] - '0' == i) {
f = 1;
cur++;
}
else if (f == 1 && s[k] - '0' == j) {
f = 0;
cur++;
}
}
if (i != j && cur % 2 == 1)
cur--;
ans = Math.max(cur, ans);
}
}
return ans;
}
var s = "100210601" ;
document.write( findAltSubSeq(s));
</script>
|
Time Complexity: O(N), as we are using a loop to traverse N times so it will cost us O(N) time
Auxiliary Space: O(1), as we are not using any extra space.