Skip to content

Files

Latest commit

c29b144 · May 17, 2024

History

History
This branch is 1 commit ahead of, 1204 commits behind doocs/leetcode:main.

0422.Valid Word Square

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
May 11, 2024
May 17, 2024
May 17, 2024
Jan 13, 2024
Nov 7, 2023
Jan 13, 2024
Jan 13, 2024
Aug 28, 2023
Jan 13, 2024
comments difficulty edit_url tags
true
简单
数组
矩阵

English Version

题目描述

给你一个字符串数组 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] 仅由小写英文字母组成。

解法

方法一:遍历检查

我们观察发现,只要不满足 w o r d s [ i ] [ j ] = w o r d s [ j ] [ i ] ,就可以直接返回 false

因此,我们只需要遍历每一行,然后检查每一行是否满足 w o r d s [ i ] [ j ] = w o r d s [ j ] [ i ] 即可。注意,如果下标越界,也直接返回 false

时间复杂度 O ( n 2 ) ,其中 n w o r d s 的长度。空间复杂度 O ( 1 )

Python3

class Solution:
    def validWordSquare(self, words: List[str]) -> bool:
        m = len(words)
        n = max(len(w) for w in words)
        if m != n:
            return False
        for j in range(n):
            if words[j] != "".join(w[j] for w in words if j < len(w)):
                return False
        return True

Java

class Solution {
    public boolean validWordSquare(List<String> words) {
        int m = words.size();
        for (int i = 0; i < m; ++i) {
            int n = words.get(i).length();
            for (int j = 0; j < n; ++j) {
                if (j >= m || i >= words.get(j).length()) {
                    return false;
                }
                if (words.get(i).charAt(j) != words.get(j).charAt(i)) {
                    return false;
                }
            }
        }
        return true;
    }
}

C++

class Solution {
public:
    bool validWordSquare(vector<string>& words) {
        int m = words.size();
        for (int i = 0; i < m; ++i) {
            int n = words[i].size();
            for (int j = 0; j < n; ++j) {
                if (j >= m || i >= words[j].size() || words[i][j] != words[j][i]) {
                    return false;
                }
            }
        }
        return true;
    }
};

Go

func validWordSquare(words []string) bool {
	m := len(words)
	for i, w := range words {
		for j := range w {
			if j >= m || i >= len(words[j]) || w[j] != words[j][i] {
				return false
			}
		}
	}
	return true
}

TypeScript

function validWordSquare(words: string[]): boolean {
    const m = words.length;
    for (let i = 0; i < m; ++i) {
        const n = words[i].length;
        for (let j = 0; j < n; ++j) {
            if (j >= m || i >= words[j].length || words[i][j] !== words[j][i]) {
                return false;
            }
        }
    }
    return true;
}

方法二

Python3

class Solution:
    def validWordSquare(self, words: List[str]) -> bool:
        m = len(words)
        for i, w in enumerate(words):
            for j, c in enumerate(w):
                if j >= m or i >= len(words[j]) or c != words[j][i]:
                    return False
        return True