422. 有效的单词方块
422. 有效的单词方块
一、题目描述
给你一个字符串数组 words
,如果它能形成一个有效的单词方块 ,则返回 true
。
有效的单词方块是指此由字符串数组组成的文字方块的第 k
行和第 k
列所显示的字符串完全相同,其中 0 <= k < max(numRows, numColumns)
。
示例
- 示例 1:
- 输入:
words = ["abcd","bnrt","crmy","dtye"]
- 输出:
true
- 解释:
- 第 1 行和第 1 列都读作 "abcd"。
- 第 2 行和第 2 列都读作 "bnrt"。
- 第 3 行和第 3 列都读作 "crmy"。
- 第 4 行和第 4 列都读作 "dtye"。
- 因此,它构成了一个有效的单词方块。
- 输入:
- 示例 2:
- 输入:
words = ["abcd","bnrt","crm","dt"]
- 输出:
true
- 解释:
- 第 1 行和第 1 列都读作 "abcd"。
- 第 2 行和第 2 列都读作 "bnrt"。
- 第 3 行和第 3 列都读作 "crm"。
- 第 4 行和第 4 列都读作 "dt"。
- 因此,它构成了一个有效的单词方块。
- 输入:
- 示例 3:
- 输入:
words = ["ball","area","read","lady"]
- 输出:
false
- 解释:
- 第 3 行读作 "read" 而第 3 列读作 "lead"。
- 因此,它不构成一个有效的单词方块。
- 输入:
提示
1 <= words.length <= 500
1 <= words[i].length <= 500
words[i]
仅由小写英文字母组成
二、代码实现
package _422;
import java.util.Arrays;
import java.util.List;
public class LeetCode422 {
public boolean validWordSquare(List<String> words) {
int n = words.size();
char[][] matrix = new char[n][];
for (int i = 0; i!= n; i++) {
char[] chars = words.get(i).toCharArray();
if (chars.length > n) return false;
matrix[i] = Arrays.copyOf(chars, n);
}
for (int i = 0; i!= n; i++) {
for (int j = i + 1; j < n; j++) {
if (matrix[i][j]!= matrix[j][i]) return false;
}
}
return true;
}
}
上述代码首先将输入的字符串列表转换为字符矩阵,并在转换过程中检查每行长度是否符合要求。然后通过双重循环比较矩阵中对称位置的字符,判断是否构成有效的单词方块。
三、代码分析
- 初始化与边界检查:
- 获取单词列表
words
的大小n
,并初始化一个字符二维数组matrix
用于存储单词方块。 - 遍历
words
,将每个单词转换为字符数组,并检查其长度是否超过n
,若超过则直接返回false
,因为无法构成有效的单词方块。然后将字符数组复制到matrix
中,并填充为长度n
。
- 获取单词列表
- 检查对称位置字符:
- 通过两层嵌套循环,遍历矩阵中
i
行j
列与j
行i
列(j > i
)的字符。如果发现任意一对对称位置的字符不相等,则返回false
。
- 通过两层嵌套循环,遍历矩阵中
- 返回结果:
- 如果上述循环没有返回
false
,说明所有对称位置的字符都相等,即构成有效的单词方块,返回true
。
- 如果上述循环没有返回