LeetCode题练习与总结:键盘行--500

ops/2024/12/28 7:59:23/

一、题目描述

给你一个字符串数组 words ,只返回可以使用在 美式键盘 同一行的字母打印出来的单词。键盘如下图所示。

请注意字符串 不区分大小写,相同字母的大小写形式都被视为在同一行

美式键盘 中:

  • 第一行由字符 "qwertyuiop" 组成。
  • 第二行由字符 "asdfghjkl" 组成。
  • 第三行由字符 "zxcvbnm" 组成。

American keyboard

示例 1:

输入:words = ["Hello","Alaska","Dad","Peace"]

输出:["Alaska","Dad"]

解释:

由于不区分大小写,"a" 和 "A" 都在美式键盘的第二行。

示例 2:

输入:words = ["omk"]

输出:[]

示例 3:

输入:words = ["adsdf","sfd"]

输出:["adsdf","sfd"]

提示:

  • 1 <= words.length <= 20
  • 1 <= words[i].length <= 100
  • words[i] 由英文字母(小写和大写字母)组成

二、解题思路

  1. 创建三个字符串变量,分别表示键盘的三行字符。
  2. 遍历输入的字符串数组 words
  3. 对于每个单词,将其转换为小写(或大写),以便统一处理。
  4. 检查单词中的每个字符是否都在同一行键盘上。具体做法是,对于单词中的每个字符,检查它是否在键盘的第一行字符中,第二行字符中,还是第三行字符中。一旦确定某个字符属于某一行,后续字符也必须在这一行中,否则该单词不符合条件。
  5. 如果单词中的所有字符都在同一行键盘上,将该单词添加到结果列表中。
  6. 返回结果列表。

三、具体代码

import java.util.ArrayList;
import java.util.List;class Solution {public String[] findWords(String[] words) {// 定义键盘三行的字符String row1 = "qwertyuiop";String row2 = "asdfghjkl";String row3 = "zxcvbnm";// 创建一个列表来存储符合条件的单词List<String> result = new ArrayList<>();// 遍历每个单词for (String word : words) {// 将单词转换为小写String lowerWord = word.toLowerCase();// 初始化一个标志,用来判断单词是否在某一行的键盘上boolean inRow1 = row1.contains(String.valueOf(lowerWord.charAt(0)));boolean inRow2 = row2.contains(String.valueOf(lowerWord.charAt(0)));boolean inRow3 = row3.contains(String.valueOf(lowerWord.charAt(0)));// 检查单词中的每个字符是否都在同一行boolean isSameRow = true;for (char c : lowerWord.toCharArray()) {if ((inRow1 && !row1.contains(String.valueOf(c))) ||(inRow2 && !row2.contains(String.valueOf(c))) ||(inRow3 && !row3.contains(String.valueOf(c)))) {isSameRow = false;break;}}// 如果单词中的所有字符都在同一行,则添加到结果列表中if (isSameRow) {result.add(word);}}// 将结果列表转换为数组并返回return result.toArray(new String[0]);}
}

这段代码首先定义了键盘三行的字符,然后遍历输入的单词数组,将每个单词转换为小写,并检查是否所有字符都在同一行键盘上。如果符合条件,则将该单词添加到结果列表中。最后,将结果列表转换为数组并返回。

四、时间复杂度和空间复杂度

1. 时间复杂度
  • 假设 words 数组中有 n 个单词。
  • 对于每个单词,我们首先将其转换为小写,这需要 O(m) 的时间复杂度,其中 m 是单词的长度。
  • 接着,我们检查单词中的每个字符是否都在同一行键盘上,这需要遍历单词中的每个字符,因此需要 O(m) 的时间复杂度。
  • 由于我们需要对每个单词都进行这样的操作,因此总的时间复杂度是 O(n * m),其中 n 是单词的数量,m 是单词的平均长度。

综上所述,时间复杂度是 O(n * m)。

2. 空间复杂度
  • 我们定义了三个字符串变量 row1row2row3 来存储键盘的行字符,这些字符串的长度是固定的,因此它们的空间复杂度是 O(1)。
  • 我们创建了一个列表 result 来存储符合条件的单词。在最坏的情况下,如果所有单词都符合条件,那么 result 的大小将与 words 相同,因此空间复杂度是 O(n)。
  • 在检查单词时,我们使用了 lowerWord 字符串来存储小写的单词,这需要 O(m) 的空间,其中 m 是单词的长度。
  • 由于 lowerWord 在每次循环时都会被重新定义,因此我们不需要将其计入总空间复杂度。

综上所述,空间复杂度是 O(n),其中 n 是输入数组 words 的大小。注意,虽然检查单词时使用了 O(m) 的空间,但由于这是在每次循环中临时使用的,所以它不影响总的空间复杂度。

五、总结知识点

  • 类定义:定义了一个名为 Solution 的类,这是面向对象编程的基础。

  • 方法定义:在类中定义了一个公共方法 findWords,它接受一个字符串数组 words 作为参数并返回一个字符串数组

  • 字符串操作

    • 使用 toLowerCase() 方法将字符串转换为小写,以便统一处理不区分大小写的字符。
    • 使用 contains() 方法检查一个字符串是否包含特定的字符。
  • 字符操作

    • 使用 char 类型来表示单个字符。
    • 使用 String.valueOf(char c) 将 char 类型转换为 String 类型。
  • 循环和条件判断

    • 使用 for 循环遍历字符串数组 words 和字符串中的每个字符。
    • 使用 if 语句和逻辑运算符进行条件判断。
  • 逻辑控制

    • 使用布尔变量 isSameRow 来标记单词中的所有字符是否都在同一行键盘上。
    • 使用 break 语句在满足特定条件时退出循环。
  • 数据结构

    • 使用 ArrayList 来存储符合条件的单词。
    • 使用 List 接口来定义 result 变量,这是泛型编程的体现。
  • 数组与列表的转换

    • 使用 toArray(new String[0]) 方法将 ArrayList 转换为数组
  • 常量字符串:定义了三个常量字符串 row1row2row3 来表示键盘的每一行字符。

  • 变量作用域:在 for 循环内部定义的变量 lowerWordinRow1inRow2inRow3isSameRow 仅在循环内部有效。

以上就是解决这个问题的详细步骤,希望能够为各位提供启发和帮助。


http://www.ppmy.cn/ops/145607.html

相关文章

http 请求总结get

关于get请求传递body的问题 错误代码 有400 , 415 等情况 <!doctype html><html lang"zh"><head><title>HTTP Status 400 – 错误的请求</title><style type"text/css">body {font-family:Tahoma,Arial,sans-seri…

网络安全攻防学习平台 - 基础关

基本方法&#xff08;本次用到&#xff09; 开发者工具&#xff1a;一般浏览器都自带开发者工具&#xff08;快捷键为F12&#xff09;&#xff0c;点击后&#xff0c;可以查看当前网页的源代码&#xff0c;智能一点的浏览器&#xff0c;将鼠标移到指定的代码上&#xff0c;就会…

每天40分玩转Django:Django静态文件

Django静态文件 一、今日学习内容概述 学习模块重要程度主要内容静态文件配置⭐⭐⭐⭐⭐基础设置、路径配置CDN集成⭐⭐⭐⭐⭐CDN配置、资源优化静态文件处理⭐⭐⭐⭐压缩、版本控制部署优化⭐⭐⭐⭐性能优化、缓存策略 二、基础配置 # settings.py import os# 静态文件配置…

【Pytorch实用教程】PyTorch 自带的数据集全面解读

下面这篇博客文章将带你快速了解 PyTorch 自带(或官方维护)的各类常用数据集,并介绍它们的使用方法,包括图像、文本和音频数据集。希望能帮助你在项目中快速上手并提高效率。 一、为什么要使用 PyTorch 自带的数据集? 1. 方便、快捷 官方维护的数据集通常已经帮助我们做好…

Elasticsearch 集群

集群结构 以三台物理机为例。在这三台物理机上&#xff0c;搭建了 6 个 ES 的节点&#xff0c;三个 data 节点&#xff0c;三个 master 节点&#xff08;每台物理机分别起了一个 data 和一个 master&#xff09;&#xff0c;3 个 master 节点&#xff0c;目的是达到&#xff0…

EasyPlayer.js播放器RTSP windows播放器SDK API的接口说明

在数字化时代&#xff0c;流媒体播放器已成为信息传播和娱乐消遣的主流载体。随着技术的进步&#xff0c;流媒体播放器的核心技术和发展趋势不断演变&#xff0c;影响着整个行业的发展方向。 那么在实际运用中&#xff0c;关于EasyPlayer RTSP windows播放器SDK API接口要注意…

算法:LeetCode470_用Rand7()实现Rand10()_java实现

/*** LeetCode470_用Rand7()实现Rand10()*/ public class LeetCode470 extends SolBase {public int rand10() {int temp 40;while (temp > 40) {temp (rand7() - 1) * 7 rand7() - 1;}return temp % 10 1;} } 解题思路分析过程&#xff1a;

系统基础 -- AXI总线协议

AXI 总线详解 1. AXI的主要特点 高性能&#xff1a; 支持多主多从架构&#xff0c;可以实现高带宽和低延迟的数据传输。完全地址分离&#xff1a; 读操作和写操作使用独立的地址通道&#xff0c;支持并发。高灵活性&#xff1a; 支持非固定地址的突发传输&#xff08;burst&a…