PHP 程序检查矩阵的所有行是否相互循环旋转

data structurephpserver side programmingprogramming更新于 2025/8/31 0:22:17

矩阵是由行和列组成的矩形数组。循环旋转是指旋转数组元素,使得旋转一次后,最后一个元素位于首位,其他元素向右移动。本题中给定一个 N*N 矩阵,目标是判断所有行是否相互循环旋转。如果是,则输出"YES",否则输出"NO"。

为了更好地理解这个问题,我们来看一些带有解释的案例。

输入 1

mat = [ [ 7, 8, 9],
      [ 9, 7, 8],
      [ 8, 9, 7] ]

输出 1

YES

解释

假设第一行是给定数组 [ 7, 8, 9],现在检查剩余行 [9, 7, 8] 和 [8, 9, 7]:

第二行 [9, 7, 8] 的旋转结果为:[8, 9, 7] 和 [7, 8, 9]

第二次旋转结果与第一行匹配。

第三行 [8, 9, 7] 的旋转结果为:[7, 8, 9] 和 [9, 7, 8]

第一次旋转结果与第一行匹配。

因此答案为"是",因为所有行都是彼此的排列。

输入 2

mat = [ [ 8, 9, 4],
      [ 9, 8, 4] ]

输出 2

NO

解释

假设第一行是给定数组 [8, 9, 4],现在检查剩余行 [9, 8, 4]:

第二行 [9, 8, 4] 的旋转结果为:[4, 9, 8] 和 [8, 4, 9]

它们都不等于第一行。

因此,答案为"否",因为并非所有行都是彼此的排列。

方法

我们已经看到了上面针对大小为 N*N 的给定矩阵的示例,让我们转到方法:

方法 1:简单方法

此方法背后的概念是将第一行存储为字符串,然后将其与自身组合,以便用于子字符串搜索操作。然后,遍历矩阵以检查其他行。将每一行转换为字符串后,检查它是否是第一行字符串的子字符串。如果是,则返回 true;否则,返回 false。

为了进一步理解上述方法,请看下面的代码。

示例

PHP 程序用于检查矩阵的所有行是否相互进行了圆周旋转

<?php
//创建一个函数来检查每一行是否相互进行了圆周旋转。
function circularRotations( &$mat, $n){
    // 创建一个包含第一行整数的字符串。
    // $strFirstRow = "";
    // 遍历矩阵,将第一行存储为字符串
    for ($i = 0 ; $i < $n ; $i++) {
      // 将第一行数字添加到变量 strFirstRow
      $strFirstRow = $strFirstRow . "-" .
         strval($mat[0][$i]);
   } 
    // 将字符串 strFirstRow 与 strFirstRow 合并,以便使用此字符串进行子字符串搜索操作
    $strFirstRow = $strFirstRow . $strFirstRow;
    // 从第一行开始遍历矩阵,检查所有剩余行
    for ($i = 1; $i < $n; $i++){
      // 创建变量 strCurrentRow 并初始化
      $strCurrentRow = "";
      // 遍历当前行
      for ($j = 0 ; $j < $n ; $j++) {
         // 将当前行号存储到变量 strCurrentRow
         $strCurrentRow = $strCurrentRow . "-" . strval($mat[$i][$j]);
      }
      // 验证组合字符串 strFirstRow 是否包含 strCurrentRow 字符串。
      if (strpos($strFirstRow, $strCurrentRow)){
         // 如果给定矩阵的每一行都是彼此的圆周旋转,则返回 true。
         return true;
      }
   }
   // 如果指定矩阵的行均不是彼此的圆周旋转,则函数返回 false。
   return false;
}
$n = 4; // 给定矩阵的大小
// 给定矩阵
$mat = array(array(6, 7, 8, 9),
            array(9, 6, 7, 8),
            array(8, 9, 6, 7),
            array(7, 8, 9, 6));       
// 调用函数检查矩阵的所有行是否相互进行圆周旋转
if (circularRotations($mat, $n)){
   echo "YES";
   echo ", all rows of the matrix are circular rotations of each 
other";
} else{
   echo "NO";
   echo ", all rows of the matrix are not circular rotations of 
   each other.";
}
?>

输出

YES, all rows of the matrix are circular rotations of each other.

时间和空间复杂度

上述代码的时间复杂度为 O(N^3),因为我们遍历矩阵并使用了 strval 和 strpos 函数。

上述代码的空间复杂度为 O(N),因为我们需要将矩阵的行存储为字符串。

其中 N 是矩阵的行和列的大小。

结论

在本教程中,我们实现了一个 PHP 程序来检查矩阵的所有行是否相互循环旋转。我们实现了一种方法,将行转换为字符串并使用 strval 和 strpos 函数。时间复杂度为 O(N^3),空间复杂度为 O(N)。其中 N 是矩阵的行和列的大小。


相关文章