PHP 程序检查矩阵的所有行是否相互循环旋转
矩阵是由行和列组成的矩形数组。循环旋转是指旋转数组元素,使得旋转一次后,最后一个元素位于首位,其他元素向右移动。本题中给定一个 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 是矩阵的行和列的大小。

