Return previous element in an expanding matrix

We have a square matrix whose size is continuously expanding by a factor of 2. Given a sequence present in the matrix at position (i, j) at any point of time, we need to return sequence present at position (i, (j + N -1)%N) where N is the size of the matrix.

When we say the matrix is expanding, the expanded matrix is formed by multiplying each element of the original 2 x 2 matrix with the current N x N matrix itself. The expanded matrix will have dimensions 2N x 2N.

For Instance, consider below 2x2 matrix,
  [a b]
  [c d]

Expanding it will result in a 4x4 matrix as follows:
ax[a b]  bx[a b]      [aa ab ba bb]
  [c d]    [c d]      [ac ad bc bd]
                  --> [ca cb da db]
cx[a b]  dx[a b]      [cc cd dc dd]
  [c d]    [c d]

Expanding it again results in an 8x8 matrix as follows, and so on.

ax[aa ab ba bb]   bx[aa ab ba bb]     [aaa aab aba abb baa bab bba bbb]
  [ac ad bc bd]     [ac ad bc bd]     [aac aad abc abd bac bad bbc bbd]
  [ca cb da db]     [ca cb da db]     [aca acb ada adb bca bcb bda bdb]
  [cc cd dc dd]     [cc cd dc dd]     [acc acd adc add bcc bcd bdc bdd]
                                  --> [caa cab cba cbb daa dab dba dbb]
cx[aa ab ba bb]   dx[aa ab ba bb]     [cac cad cbc cbd dac dad dbc dbd]
  [ac ad bc bd]     [ac ad bc bd]     [cca ccb cda cdb dca dcb dda ddb]
  [ca cb da db]     [ca cb da db]     [ccc ccd cdc cdd dcc dcd ddc ddd]
  [cc cd dc dd]     [cc cd dc dd]

Basically, for a given sequence, we need to find out the sequence just left to it. The matrix may be assumed circular i.e. sequence present at position (i, 0) should return sequence present at position (i, N-1)



Examples:

Input: str = dda
Output: dcb

Input: str = cca
Output: ddb

Input: str = aacbddc
Output: aacbdcd  

We strongly recommend you to minimize your browser and try this yourself first.

If we carefully analyze, we can see a pattern here.

Algorithm:
We start scanning the string from the rightmost position and for each character do the following –

1. If the current character is ‘b’ or ‘d’, change to ‘a’ or ‘c’ respectively and return the string.

2. If the current character is ‘a’ or ‘c’, change it to ‘b’ or ‘d’ respectively and move to the next character to the left. Repeat Step 1 for the next left character.

C++

filter_none

edit
close

play_arrow

link
brightness_4
code

// C++ Program to return previous element in an expanding
// matrix.
#include <bits/stdc++.h>
using namespace std;
  
// Returns left of str in an expanding matrix of
// a, b, c, and d.
string findLeft(string str)
{
    int n = str.length();
  
    // Start from rightmost position
    while (n--)
    {
        // If the current character is ‘b’ or ‘d’,
        // change to ‘a’ or ‘c’ respectively and
        // break the loop
        if (str[n] == 'd')
        {
            str[n] = 'c';
            break;
        }
        if (str[n] == 'b')
        {
            str[n] = 'a';
            break;
        }
  
        // If the current character is ‘a’ or ‘c’,
        // change it to ‘b’ or ‘d’ respectively
        if (str[n] == 'a')
            str[n] = 'b';
        else if (str[n] == 'c')
            str[n] = 'd';
    }
  
    return str;
}
  
// driver program to test above method
int main()
{
    string str = "aacbddc";
    cout << "Left of " << str << " is "
         << findLeft(str);
   return 0;
}

chevron_right


Java

filter_none

edit
close

play_arrow

link
brightness_4
code

// Java program to return previous element
// in an expanding matrix
import java.io.*;
   
class GFG 
{
    // Returns left of str in an expanding matrix 
    // of a, b, c  and d.
    static StringBuilder findLeft(StringBuilder str)
    {
        int n = str.length();
       
        // Start from rightmost position
        while (n > 0)
        {
            n--;
            
            // If the current character is b or d,
            // change to a or c respectively and
            // break the loop
            if (str.charAt(n) == 'd')
            {
                str.setCharAt(n,'c');
                break;
            }
            if (str.charAt(n) == 'b')
            {
                str.setCharAt(n,'a');
                break;
            }
       
            // If the current character is a or c,
            // change it to b or d respectively
            if (str.charAt(n) == 'a')
                str.setCharAt(n,'b');
            else if (str.charAt(n) == 'c')
                str.setCharAt(n,'d');
        }
       
        return str;
    }
       
    // driver program to test above method
    public static void main (String[] args) 
    {
        StringBuilder str = new StringBuilder("aacbddc");
        System.out.print("Left of " + str + " is "
                                    findLeft(str));
    }
}
   
// This code is contributed by Prakriti Gupta

chevron_right


Python3

filter_none

edit
close

play_arrow

link
brightness_4
code

# Python3 Program to return previous element 
# in an expanding matrix.
  
# Returns left of str in an 
# expanding matrix of a, b, c, and d.
def findLeft(str):
    n = len(str) - 1;
  
    # Start from rightmost position
    while (n > 0):
          
        # If the current character is ‘b’ or ‘d’,
        # change to ‘a’ or ‘c’ respectively and
        # break the loop
        if (str[n] == 'd'):
            str = str[0:n] + 'c' + str[n + 1:];
            break;
  
        if (str[n] == 'b'):
            str = str[0:n] + 'a' + str[n + 1:];
            break;
  
        # If the current character is ‘a’ or ‘c’,
        # change it to ‘b’ or ‘d’ respectively
        if (str[n] == 'a'):
            str = str[0:n] + 'b' + str[n + 1:];
        elif (str[n] == 'c'):
            str = str[0:n] + 'd' + str[n + 1:];
        n-=1;
  
    return str;
  
# Driver Code
if __name__ == '__main__':
    str = "aacbddc";
    print("Left of", str, "is", findLeft(str));
  
# This code is contributed by PrinciRaj1992

chevron_right


C#

filter_none

edit
close

play_arrow

link
brightness_4
code

using System;
using System.Text;
  
// C# program to return previous element 
// in an expanding matrix 
  
public class GFG
{
    // Returns left of str in an expanding matrix  
    // of a, b, c  and d. 
    public static StringBuilder findLeft(StringBuilder str)
    {
        int n = str.Length;
  
        // Start from rightmost position 
        while (n > 0)
        {
            n--;
  
            // If the current character is b or d, 
            // change to a or c respectively and 
            // break the loop 
            if (str[n] == 'd')
            {
                str[n] = 'c';
                break;
            }
            if (str[n] == 'b')
            {
                str[n] = 'a';
                break;
            }
  
            // If the current character is a or c, 
            // change it to b or d respectively 
            if (str[n] == 'a')
            {
                str[n] = 'b';
            }
            else if (str[n] == 'c')
            {
                str[n] = 'd';
            }
        }
  
        return str;
    }
  
    // driver program to test above method 
    public static void Main(string[] args)
    {
        StringBuilder str = new StringBuilder("aacbddc");
        Console.Write("Left of " + str + " is " + findLeft(str));
    }
}
  
// This code is contributed by Shrikant13

chevron_right


PHP

filter_none

edit
close

play_arrow

link
brightness_4
code

<?php 
// PHP program to return previous element in an expanding
// matrix.
   
// Returns left of str in an expanding matrix of
// a, b, c  and d.
function findLeft($str)
{
    $n = strlen($str);
   
    // Start from rightmost position
    while ($n--)
    {
        // If the current character is ‘b’ or ‘d’,
        // change to ‘a’ or ‘c’ respectively and
        // break the loop
        if ($str[$n] == 'd')
        {
            $str[$n] = 'c';
            break;
        }
        if ($str[$n] == 'b')
        {
            $str[$n] = 'a';
            break;
        }
   
        // If the current character is ‘a’ or ‘c’,
        // change it to ‘b’ or ‘d’ respectively
        if ($str[$n] == 'a')
            $str[$n] = 'b';
        else if ($str[$n] == 'c')
            $str[$n] = 'd';
    }
   
    return $str;
}
   
// Driver Code
$str = "aacbddc";
echo "Left of " . $str . " is "
         . findLeft($str);
return 0;
?>

chevron_right



Output :

Left of aacbddc is aacbdcd

This article is contributed by Aditya Goel. Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above



My Personal Notes arrow_drop_up



Article Tags :
Practice Tags :


Be the First to upvote.


Please write to us at contribute@geeksforgeeks.org to report any issue with the above content.