首页 > 其他分享 >LeetCode题练习与总结:键盘行--500

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

时间:2024-12-27 23:56:17浏览次数:6  
标签:字符 String -- 复杂度 单词 words 键盘 LeetCode 500

一、题目描述

给你一个字符串数组 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 仅在循环内部有效。

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

标签:字符,String,--,复杂度,单词,words,键盘,LeetCode,500
From: https://blog.csdn.net/weixin_62860386/article/details/144755299

相关文章

  • 基于大数据 Python 抖音数据分析可视化系统(源码+LW+部署讲解+数据库+ppt)
    !!!!!!!!!很对人不知道选题怎么选不清楚自己适合做哪块内容都可以免费来问我避免后期給自己答辩找麻烦增加难度(部分学校只有一次答辩机会没弄好就延迟毕业了)会持续一直更新下去有问必答一键收藏关注不迷路源码获取:https://pan.baidu.com/s/1aRpOv3f2sdtVYOogQjb8jg?pwd=jf1d......
  • 【计算机毕业设计选题推荐】最新毕设选题----基于SpringBoot的农产品运输管理系统的设
    博主介绍:原计算机互联网大厂开发,十年开发经验,带领技术团队几十名,专注技术开发,计算机毕设实战导师,专注Java、Python、小程序、安卓、深度学习和算法开发研究。主要服务内容:选题定题、开题报告、任务书、程序开发、文档编写和辅导、文档降重、程序讲解、答辩辅导等,欢迎咨询~......
  • 【计算机毕业设计选题】最新毕设选题----基于Java的游戏推荐系统的设计与实现(源码+数
    博主介绍:原计算机互联网大厂开发,十年开发经验,带领技术团队几十名,专注技术开发,计算机毕设实战导师,专注Java、Python、小程序、安卓、深度学习和算法开发研究。主要服务内容:选题定题、开题报告、任务书、程序开发、文档编写和辅导、文档降重、程序讲解、答辩辅导等,欢迎咨询~......
  • 林业产品推荐系统的设计与实现(代码+数据库+LW)
    摘 要网络技术和计算机技术发展至今,已经拥有了深厚的理论基础,并在现实中进行了充分运用,尤其是基于计算机运行的软件更是受到各界的关注。加上现在人们已经步入信息时代,所以对于信息的宣传和管理就很关键。因此林业产品销售信息的管理计算机化,系统化是必要的。设计开发林业产......
  • 红蓝对抗重点OA系统漏洞利用工具新年贺岁版V2.0
    免责声明 本系列工具仅供安全专业人员进行已授权环境使用,此工具所提供的功能只为网络安全人员对自己所负责的网站、服务器等(包括但不限于)进行检测或维护参考,未经授权请勿利用工具中的功能对任何计算机系统进行入侵操作。利用此工具所提供的信息而造成的直接或间接后果和损......
  • Android编译相关文章收集
    前言全局说明一、说明1.1环境:Android二、系列文章2.1深入浅出Androidmakefile(1)--初探https://www.iteye.com/blog/nfer-zhuang-1752368(2)--LOCAL_PATHhttps://www.iteye.com/blog/nfer-zhuang-1752387(3)--LOCAL_SRC_FILEShttps://www.iteye.com/blog/nfer-z......
  • 杨表的 zhicheng 宝典选抄
    还没写完,也没排版,目前只是个记录东西在这里的地方。注:这里提及的杨表从左上到右下是递增的。两包含关系的杨表(图形)之差得到斜杨表。斜杨表\(\lambda\)的内凹槽\(c\)是满足这样性质的点:\(c\not\in\lambda,\existsc'\in\lambda,c\lec'\),且\(\lambda\cup\{c\}\)也是......
  • 《计算机组成及汇编语言原理》阅读笔记:p121-p122
    《计算机组成及汇编语言原理》学习第8天,p121-p122总结,总计2页。一、技术总结1.memory优化(1)cachememoryremoveblankfrom"Mostcomputerssupporttwodifferentkinds(levels)ofcache:levelone(L1)cacheisbuiltintotheCPUchipitselfandrunsatCPU......
  • 四元数旋转:从一维到四维
    四元数旋转:从一维到四维Main1、前言本文讨论四元数与三维空间中的旋转关系,也就是四元数从四维空间对三维空间里的向量起了什么作用。众所周知,四元数存在于四维中,这也让它蒙上了一层神秘的色彩;很多文章把它描述得更加神秘,而有些文章为了使其“去神秘化”又写得太过简短,导致很多......
  • 004. [NOIP2017 提高组] 机器翻译(洛谷P1540)
    004.[NOIP2017提高组]机器翻译(洛谷P1540)题目背景NOIP2010提高组T1题目描述小晨的电脑上安装了一个机器翻译软件,他经常用这个软件来翻译英语文章。这个翻译软件的原理很简单,它只是从头到尾,依次将每个英文单词用对应的中文含义来替换。对于每个英文单词,软件会先在内存中查......