Open In App

C++ Program to Check if all rows of a matrix are circular rotations of each other

Improve
Improve
Like Article
Like
Save
Share
Report

Given a matrix of n*n size, the task is to find whether all rows are circular rotations of each other or not. 

Examples: 

Input: mat[][] = 1, 2, 3

                 3, 1, 2

                 2, 3, 1

Output:  Yes, All rows are rotated permutationof each other.
Input: mat[3][3] = 1, 2, 3

                   3, 2, 1

                   1, 3, 2
Output:  No , As 3, 2, 1 is not a rotated or circular permutation of 1, 2, 3

The idea is based on below article. 
A Program to check if strings are rotations of each other or not

Steps :  

  1. Create a string of first row elements and concatenate the string with itself so that string search operations can be efficiently performed. Let this string be str_cat.
  2. Traverse all remaining rows. For every row being traversed, create a string str_curr of current row elements. If str_curr is not a substring of str_cat, return false.
  3. Return true.

Below is the implementation of above steps. 

C++




// C++ program to check if all rows of a matrix
// are rotations of each other
#include <bits/stdc++.h>
using namespace std;
const int MAX = 1000;
 
// Returns true if all rows of mat[0..n-1][0..n-1]
// are rotations of each other.
bool isPermutedMatrix( int mat[MAX][MAX], int n)
{
    // Creating a string that contains elements of first
    // row.
    string str_cat = "";
    for (int i = 0 ; i < n ; i++)
        str_cat = str_cat + "-" + to_string(mat[0][i]);
 
    // Concatenating the string with itself so that
    // substring search operations can be performed on
    // this
    str_cat = str_cat + str_cat;
 
    // Start traversing remaining rows
    for (int i=1; i<n; i++)
    {
        // Store the matrix into vector in the form
        // of strings
        string curr_str = "";
        for (int j = 0 ; j < n ; j++)
            curr_str = curr_str + "-" + to_string(mat[i][j]);
 
        // Check if the current string is present in
        // the concatenated string or not
        if (str_cat.find(curr_str) == string::npos)
            return false;
    }
 
    return true;
}
 
// Drivers code
int main()
{
    int n = 4 ;
    int mat[MAX][MAX] = {{1, 2, 3, 4},
        {4, 1, 2, 3},
        {3, 4, 1, 2},
        {2, 3, 4, 1}
    };
    isPermutedMatrix(mat, n)? cout << "Yes" :
                              cout << "No";
    return 0;
}


Output

Yes

Time complexity : O(n3
Auxiliary Space : O(n)

Please refer complete article on Check if all rows of a matrix are circular rotations of each other for more details!



Last Updated : 11 Jul, 2022
Like Article
Save Article
Previous
Next
Share your thoughts in the comments
Similar Reads