Longest subsequence of a number having same left and right rotation
Last Updated :
27 May, 2022
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++
// C++ Program to implement
// the above approach
#include <bits/stdc++.h>
using namespace std;
// Function to find the longest subsequence
// having equal left and right rotation
int findAltSubSeq(string s)
{
// Length of the string
int n = s.size(), ans = INT_MIN;
// Iterate for all possible combinations
// of a two-digit numbers
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 10; j++) {
int cur = 0, f = 0;
// Check for alternate occurrence
// of current combination
for (int k = 0; k < n; k++) {
if (f == 0 and s[k] - '0' == i) {
f = 1;
// Increment the current value
cur++;
}
else if (f == 1 and s[k] - '0' == j) {
f = 0;
// Increment the current value
cur++;
}
}
// If alternating sequence is
// obtained of odd length
if (i != j and cur % 2 == 1)
// Reduce to even length
cur--;
// Update answer to store
// the maximum
ans = max(cur, ans);
}
}
// Return the answer
return ans;
}
// Driver Code
int main()
{
string s = "100210601";
cout << findAltSubSeq(s);
return 0;
}
Java
// Java Program to implement
// the above approach
import java.util.*;
class GFG{
// Function to find the longest subsequence
// having equal left and right rotation
static int findAltSubSeq(String s)
{
// Length of the String
int n = s.length(), ans = Integer.MIN_VALUE;
// Iterate for all possible combinations
// of a two-digit numbers
for (int i = 0; i < 10; i++)
{
for (int j = 0; j < 10; j++)
{
int cur = 0, f = 0;
// Check for alternate occurrence
// of current combination
for (int k = 0; k < n; k++)
{
if (f == 0 && s.charAt(k) - '0' == i)
{
f = 1;
// Increment the current value
cur++;
}
else if (f == 1 &&
s.charAt(k) - '0' == j)
{
f = 0;
// Increment the current value
cur++;
}
}
// If alternating sequence is
// obtained of odd length
if (i != j && cur % 2 == 1)
// Reduce to even length
cur--;
// Update answer to store
// the maximum
ans = Math.max(cur, ans);
}
}
// Return the answer
return ans;
}
// Driver Code
public static void main(String[] args)
{
String s = "100210601";
System.out.print(findAltSubSeq(s));
}
}
// This code is contributed by PrinciRaj1992
Python3
# Python3 program to implement
# the above approach
import sys
# Function to find the longest subsequence
# having equal left and right rotation
def findAltSubSeq(s):
# Length of the string
n = len(s)
ans = -sys.maxsize - 1
# Iterate for all possible combinations
# of a two-digit numbers
for i in range(10):
for j in range(10):
cur, f = 0, 0
# Check for alternate occurrence
# of current combination
for k in range(n):
if (f == 0 and ord(s[k]) -
ord('0') == i):
f = 1
# Increment the current value
cur += 1
elif (f == 1 and ord(s[k]) -
ord('0') == j):
f = 0
# Increment the current value
cur += 1
# If alternating sequence is
# obtained of odd length
if i != j and cur % 2 == 1:
# Reduce to even length
cur -= 1
# Update answer to store
# the maximum
ans = max(cur, ans)
# Return the answer
return ans
# Driver code
s = "100210601"
print(findAltSubSeq(s))
# This code is contributed by Stuti Pathak
C#
// C# Program to implement
// the above approach
using System;
class GFG{
// Function to find the longest subsequence
// having equal left and right rotation
static int findAltSubSeq(String s)
{
// Length of the String
int n = s.Length, ans = int.MinValue;
// Iterate for all possible combinations
// of a two-digit numbers
for (int i = 0; i < 10; i++)
{
for (int j = 0; j < 10; j++)
{
int cur = 0, f = 0;
// Check for alternate occurrence
// of current combination
for (int k = 0; k < n; k++)
{
if (f == 0 && s[k] - '0' == i)
{
f = 1;
// Increment the current value
cur++;
}
else if (f == 1 &&
s[k] - '0' == j)
{
f = 0;
// Increment the current value
cur++;
}
}
// If alternating sequence is
// obtained of odd length
if (i != j && cur % 2 == 1)
// Reduce to even length
cur--;
// Update answer to store
// the maximum
ans = Math.Max(cur, ans);
}
}
// Return the answer
return ans;
}
// Driver Code
public static void Main(String[] args)
{
String s = "100210601";
Console.Write(findAltSubSeq(s));
}
}
// This code is contributed by PrinciRaj1992
JavaScript
<script>
// Javascript Program to implement
// the above approach
// Function to find the longest subsequence
// having equal left and right rotation
function findAltSubSeq(s)
{
// Length of the string
var n = s.length, ans = -1000000000;
// Iterate for all possible combinations
// of a two-digit numbers
for (var i = 0; i < 10; i++) {
for (var j = 0; j < 10; j++) {
var cur = 0, f = 0;
// Check for alternate occurrence
// of current combination
for (var k = 0; k < n; k++) {
if (f == 0 && s[k] - '0' == i) {
f = 1;
// Increment the current value
cur++;
}
else if (f == 1 && s[k] - '0' == j) {
f = 0;
// Increment the current value
cur++;
}
}
// If alternating sequence is
// obtained of odd length
if (i != j && cur % 2 == 1)
// Reduce to even length
cur--;
// Update answer to store
// the maximum
ans = Math.max(cur, ans);
}
}
// Return the answer
return ans;
}
// Driver Code
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.
Similar Reads
Javascript Program for Longest subsequence of a number having same left and right rotation 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"
4 min read
Longest subsequence of even numbers in an Array Given an array arr[] containing N integers, the task is to print the length of the longest subsequence of even numbers in the array. Examples: Input: arr[] = {3, 4, 11, 2, 9, 21} Output: 2 Explanation: The longest subsequence containing even numbers is {4, 2}. Hence, the answer is 2. Input: arr[] =
5 min read
Size of longest Sequence having multiples of one of given two numbers Given two numbers A & B, the task is to find the length of the maximum sequence containing multiples of either A or B only from a sequence of all the multiples of A & B. Common multiples of A & B can not be included in either of the group. Examples: Input: A = 5, B = 7Output: 2Explanatio
6 min read
Printing Longest Increasing Subsequence (LIS) Given a sequence of numbers, the task is to find and print the Longest Increasing Subsequence (LIS), the longest subsequence where each element is strictly greater than the previous one. If multiple LIS of the same maximum length exist, we must select the one that appears first based on the lexicogr
15+ min read
Longest sequence of positive integers in an array Find the longest-running positive sequence in an array. Examples: Input : arr[] = {1, 2, -3, 2, 3, 4, -6, 1, 2, 3, 4, 5, -8, 5, 6} Output :Index : 7, length : 5 Input : arr[] = {-3, -6, -1, -3, -8} Output : No positive sequence detected. A simple solution is to use two nested loops. In the outer loo
7 min read