哈希表题目:键盘行

news2024/11/27 8:21:21

文章目录

  • 题目
    • 标题和出处
    • 难度
    • 题目描述
      • 要求
      • 示例
      • 数据范围
  • 解法
    • 思路和算法
    • 代码
    • 复杂度分析

题目

标题和出处

标题:键盘行

出处:500. 键盘行

难度

2 级

题目描述

要求

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

美式键盘中:

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

示例 0

示例

示例 1:

输入: words   =   ["Hello","Alaska","Dad","Peace"] \texttt{words = ["Hello","Alaska","Dad","Peace"]} words = ["Hello","Alaska","Dad","Peace"]
输出: ["Alaska","Dad"] \texttt{["Alaska","Dad"]} ["Alaska","Dad"]

示例 2:

输入: words   =   ["omk"] \texttt{words = ["omk"]} words = ["omk"]
输出: [] \texttt{[]} []

示例 3:

输入: words   =   ["adsdf","sfd"] \texttt{words = ["adsdf","sfd"]} words = ["adsdf","sfd"]
输出: ["adsdf","sfd"] \texttt{["adsdf","sfd"]} ["adsdf","sfd"]

数据范围

  • 1 ≤ words.length ≤ 20 \texttt{1} \le \texttt{words.length} \le \texttt{20} 1words.length20
  • 1 ≤ words[i].length ≤ 100 \texttt{1} \le \texttt{words[i].length} \le \texttt{100} 1words[i].length100
  • words[i] \texttt{words[i]} words[i] 由英语字母(小写和大写字母)组成

解法

思路和算法

为了判断一个单词是否由键盘同一行的字母组成,需要预处理每个字母所在的键盘行,可以使用哈希表记录每个字母所在的键盘行的编号。

一个单词由键盘同一行的字母组成,等价于该单词的任意两个字母所在的键盘行的编号相同,因此在判断一个单词是否由键盘同一行的字母组成时,可以首先得到该单词的首字母所在的键盘行的编号,然后判断该单词的其余每个字母所在的键盘行的编号是否和该单词的首字母所在的键盘行的编号相同。

实现方面,由于每个单词都由英语字母组成,因此可以使用长度为 26 26 26 的数组代替哈希表。由于单词中可能有小写和大写字母,因此在记录和判断每个字母所在的键盘行的编号时,需要首先将字母转成小写字母,然后进行相应的操作。

代码

class Solution {
    public String[] findWords(String[] words) {
        String[] lettersEachRow = {"qwertyuiop", "asdfghjkl", "zxcvbnm"};
        int rows = lettersEachRow.length;
        int[] map = new int[26];
        for (int i = 0; i < rows; i++) {
            String letters = lettersEachRow[i];
            int lettersCount = letters.length();
            for (int j = 0; j < lettersCount; j++) {
                map[letters.charAt(j) - 'a'] = i;
            }
        }
        List<String> rowWordsList = new ArrayList<String>();
        for (String word : words) {
            boolean flag = true;
            int wordLength = word.length();
            int row = map[Character.toLowerCase(word.charAt(0)) - 'a'];
            for (int i = 1; i < wordLength; i++) {
                int currRow = map[Character.toLowerCase(word.charAt(i)) - 'a'];
                if (currRow != row) {
                    flag = false;
                    break;
                }
            }
            if (flag) {
                rowWordsList.add(word);
            }
        }
        int length = rowWordsList.size();
        String[] rowWords = new String[length];
        for (int i = 0; i < length; i++) {
            rowWords[i] = rowWordsList.get(i);
        }
        return rowWords;
    }
}

复杂度分析

  • 时间复杂度: O ( ∣ Σ ∣ + L ) O(|\Sigma| + L) O(Σ+L),其中 L L L 是数组 words \textit{words} words 中的单词长度之和, Σ \Sigma Σ 是字符集,这道题中 Σ \Sigma Σ 是全部英语字母(不区分大小写), ∣ Σ ∣ = 26 |\Sigma| = 26 Σ=26。首先遍历全部英语字母并在哈希表中记录每个字母所在的键盘行的编号,时间复杂度是 O ( ∣ Σ ∣ ) O(|\Sigma|) O(Σ),然后遍历数组 words \textit{words} words 中的每个单词并判断是否由键盘同一行的字母组成,每个单词的每个字母都会遍历一次,时间复杂度是 O ( L ) O(L) O(L),因此总时间复杂度是 O ( ∣ Σ ∣ + L ) O(|\Sigma| + L) O(Σ+L)

  • 空间复杂度: O ( ∣ Σ ∣ ) O(|\Sigma|) O(Σ),其中 Σ \Sigma Σ 是字符集,这道题中 Σ \Sigma Σ 是全部英语字母(不区分大小写), ∣ Σ ∣ = 26 |\Sigma| = 26 Σ=26。空间复杂度主要取决于哈希表,哈希表需要记录每个字母所在的键盘行的编号。注意返回值不计入空间复杂度。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/51726.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Scala集合习题Ⅱ

行是知之始&#xff0c;知是行之成。——陶行知 目录 练习题 3 &#xff1a;求出各城市的平均温度 练习题4&#xff1a;请用scala得出以下的结果 练习题 3 &#xff1a;求出各城市的平均温度 val d1 Array(("bj", 28.1), ("sh", 28.7), ("gz"…

RK3588平台开发系列讲解(PWM篇)PWM及backlight的使用方法

平台内核版本安卓版本RK3588Linux 5.10Android12🚀返回专栏总目录 文章目录 一、PWM驱动二、DTS配置三、PWM在user space的使用四、PWM在背光中的使用4.1 Backlight DTS4.2 PWM Backlight 调试沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇将介绍PWM以及backli…

SpringBoot结合Quartz实现定时任务

《从零打造项目》系列文章 工具 比MyBatis Generator更强大的代码生成器 ORM框架选型 SpringBoot项目基础设施搭建SpringBoot集成Mybatis项目实操SpringBoot集成MybatisPlus项目实操SpringBoot集成Spring Data JPA项目实操 数据库变更管理 数据库变更管理&#xff1a;Liquibase…

深入讲解Netty那些事儿之从内核角度看IO模型(上)

我们都知道Netty是一个高性能异步事件驱动的网络框架。 它的设计异常优雅简洁&#xff0c;扩展性高&#xff0c;稳定性强。拥有非常详细完整的用户文档。 同时内置了很多非常有用的模块基本上做到了开箱即用&#xff0c;用户只需要编写短短几行代码&#xff0c;就可以快速构建…

8、python中的模块和包

文章目录模块模块导入的方式直接导入部分导入import module 和from module import *的区别模块的其他信息_ _ name _ _ 的特殊使用模块的分类包从包中导入模块的方式模块 模块就是工具包,要想使用这个工具包中的工具(就好比函数),就需要导入这个模块 模块是非常简单的Python文…

pandas交叉表与透视表pd.crosstab()和pd.pivot_table()函数详解

一、交叉表 交叉表&#xff1a;用于计算一列数据对于另外一列数据的分组个数(用于统计分组频率的特殊透视表)&#xff0c;pd.crosstab(value1, value2)pandas.crosstab(index, columns, valuesNone, rownamesNone, colnamesNone, aggfuncNone, marginsFalse, margins_nameAll,…

【虚幻引擎】UE4/UE5 动画蓝图,混合空间,目标偏移,动画蒙太奇之间的联系

一、UE动画介绍 虚幻引擎在为角色设置移动行走时&#xff0c;为了更好的调节和控制人物的相关动画&#xff0c;设置了一系列的跟人物相关的动画&#xff0c;其中包括一维混合空间&#xff0c;二维混合空间&#xff0c;动画蒙太奇&#xff0c;目标偏移等&#xff0c;动画蓝图的出…

Day16--加入购物车-动态设置tabBar的数组徽标

问题1&#xff1a; ①&#xff1a;刚开始 ②&#xff1a;点击购物车的图标后&#xff0c;跳转到cart页面发现&#xff0c;并没有徽标在tabbar上&#xff1a; 提纲挈领&#xff1a; 我的操作&#xff1a; 1》把 Store 中的 total 映射到 cart.vue 中使用&#xff1a; 2》在页面…

Java ArrayLIst与顺序表

什么是集合类&#xff1f; Java当中的集合类&#xff0c;其实就是封装号的数据结构 原始的数据结构——>Java当中封装成的集合对应的那个原始的数据结构——>用Java封装的集合对应的。 集合类所在的包&#xff1a;java.util这个包底下 顺序表的底层是一个数组&#xff0…

Flutter状态管理

前言 状态管理是什么&#xff1f;简单的来说&#xff0c;就是当某个状态发生变化的时候&#xff0c;告知该状态的监听者&#xff0c;让状态所监听的属性随之而改变&#xff0c;达到UI层随着数据层变化而变化的效果。在Flutter中的状态(State)是一个组件的UI数据模型&#xff0…

【MySQL 读写分离】Sharding JDBC + Spring boot 实现数据库读写分离的登录 Demo

上篇文章我们搭建了 MySQL 数据库主从复制集群 MySQL 搭建主从复制集群~~~ 本篇文章我们利用搭建好的主从复制集群&#xff0c;使用 SpringBoot 结合 Sharding-JDBC 搭建一个小的 登录 Demo&#xff0c;测试实现数据库的读写分离 项目源码地址&#xff1a; https://gitee.com/l…

13 【操作mysql数据库】

13 【操作mysql数据库】 1.mysql 介绍 付费的商用数据库&#xff1a; Oracle&#xff0c;典型的高富帅&#xff1b;SQL Server&#xff0c;微软自家产品&#xff0c;Windows定制专款&#xff1b;DB2&#xff0c;IBM的产品&#xff0c;听起来挺高端&#xff1b;Sybase&#x…

android WebRtc 视频通话(P2P)

概述 WebRTC名称源自网页实时通信(Web Real-Time Communication)的缩写&#xff0c;是一个支持网页浏览器进行实时语音对话或视频对话的技术&#xff0c;是谷歌2010年以6820万美元收购Global IP Solutions公司而获得的一项技术。Google于2011年6月3日开源的即时通讯项目&#x…

centos7中mysql5.7.32服务离线升级到5.7.39教程

目录 一、导入新的离线安装包 二、备份原有mysql数据库 1、停止tomcat服务 2、查看mysql服务 3、备份数据库 三、停止mysql服务并打包备份旧版本 1、停止mysql 2、打包旧的mysql文件夹 3、删除旧的mysql文件夹 4、删除/etc/init.d/下跟mysql有关的全部文件&#xff0…

MongoDB数据迁移之迁移工具Kettle

MongoDB数据迁移之迁移工具Kettle ETL:简介 ETL&#xff08;Extract-Transform-Load的缩写&#xff0c;即数据抽取、转换、装载的过程&#xff09;&#xff0c;对于企业或行业应用来说&#xff0c;我们经常会遇到各种数据的处理&#xff0c;转换&#xff0c;迁移&#xff0c;所…

Java+JSP+MySQL基于SSM的医院挂号就诊系统-计算机毕业设计

项目介绍 随着计算机科技的快速发展&#xff0c;很多地方都实现了自动化管理&#xff0c;医院也不例外。在大多数医院&#xff0c;无论是挂号处&#xff0c;还是取药的窗口&#xff0c;都会看到有很长的队伍&#xff0c;很显然这样会让患者就医的过程中浪费太多的时间。其次&a…

【读论文】GANMcC

GANMcC简单介绍网络结构生成器辨别器损失函数生成器损失函数辨别器tips总结参考论文&#xff1a;https://ieeexplore.ieee.org/document/9274337 如有侵权请联系博主 这几天又读了一篇关于GAN实现红外融合的论文&#xff0c;不出意外&#xff0c;还是FusionGAN作者团队的人写…

Python语音合成小工具(PyQt5 + pyttsx3)

TTS简介 TTS&#xff08;Text To Speech&#xff09;是一种语音合成技术&#xff0c;可以让机器将输入文本以语音的方式播放出来&#xff0c;实现机器说话的效果。 TTS分成语音处理及语音合成&#xff0c;先由机器识别输入的文字&#xff0c;再根据语音库进行语音合成。现在有…

JavaScript -- 三种循环语句的介绍及示例代码

文章目录循环语句1 While循环2 do-while循环3 for循环4 嵌套循环循环语句 通过循环语句可以使指定的代码反复执行 JS中一共有三种循环语句 while语句do-while语句for语句 通常编写一个循环&#xff0c;要有三个要件 初始化表达式&#xff08;初始化变量&#xff09;条件表…

风云气象卫星系列介绍

风云气象卫星系列是中国于1977年开始研制的气象卫星系列&#xff0c;目前发射了风云一号、风云二号、风云三号、风云四号等卫星。 风云一号 FY-1卫星分为两个批次&#xff0c;各两颗星。01批的FY-1A星于1988年7月9日发射&#xff0c;FY-1B星于1990年9月3日发射。02批卫星在01批…