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 <= 5001 <= words[i].length <= 500words[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。
- 如果上述循环没有返回

365

被折叠的 条评论
为什么被折叠?



