422. 有效的单词方块

422. 有效的单词方块

一、题目描述

给你一个字符串数组 words,如果它能形成一个有效的单词方块 ,则返回 true 。

有效的单词方块是指此由字符串数组组成的文字方块的第 k 行和第 k 列所显示的字符串完全相同,其中 0 <= k < max(numRows, numColumns) 。

示例

  1. 示例 1
    • 输入words = ["abcd","bnrt","crmy","dtye"]
    • 输出true
    • 解释:
      • 第 1 行和第 1 列都读作 "abcd"。
      • 第 2 行和第 2 列都读作 "bnrt"。
      • 第 3 行和第 3 列都读作 "crmy"。
      • 第 4 行和第 4 列都读作 "dtye"。
      • 因此,它构成了一个有效的单词方块。
  2. 示例 2
    • 输入words = ["abcd","bnrt","crm","dt"]
    • 输出true
    • 解释:
      • 第 1 行和第 1 列都读作 "abcd"。
      • 第 2 行和第 2 列都读作 "bnrt"。
      • 第 3 行和第 3 列都读作 "crm"。
      • 第 4 行和第 4 列都读作 "dt"。
      • 因此,它构成了一个有效的单词方块。
  3. 示例 3
    • 输入words = ["ball","area","read","lady"]
    • 输出false
    • 解释:
      • 第 3 行读作 "read" 而第 3 列读作 "lead"。
      • 因此,它不构成一个有效的单词方块。

提示

  1. 1 <= words.length <= 500
  2. 1 <= words[i].length <= 500
  3. 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;
    }
}

上述代码首先将输入的字符串列表转换为字符矩阵,并在转换过程中检查每行长度是否符合要求。然后通过双重循环比较矩阵中对称位置的字符,判断是否构成有效的单词方块。

三、代码分析

  1. 初始化与边界检查
    • 获取单词列表 words 的大小 n,并初始化一个字符二维数组 matrix 用于存储单词方块。
    • 遍历 words,将每个单词转换为字符数组,并检查其长度是否超过 n,若超过则直接返回 false,因为无法构成有效的单词方块。然后将字符数组复制到 matrix 中,并填充为长度 n
  2. 检查对称位置字符
    • 通过两层嵌套循环,遍历矩阵中 i 行 j 列与 j 行 i 列(j > i)的字符。如果发现任意一对对称位置的字符不相等,则返回 false
  3. 返回结果
    • 如果上述循环没有返回 false,说明所有对称位置的字符都相等,即构成有效的单词方块,返回 true
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值