【面试经典150】day 11

目录

1.无重复字符的最长子串

2.串联所有单词的子串

3.最小覆盖子串

4.有效的数独
​​​​​​​

1.无重复字符的最长子串

class Solution {public int lengthOfLongestSubstring(String s) {//定义哈希表Map<Character,Integer> dict=new HashMap<>();int ret=0;int i=-1;for(int j=0;j<s.length();j++){char c=s.charAt(j);//如果字符在字典中存在,更新左指针if(dict.containsKey(c)){i=Math.max(i,dict.get(c));}//存入最新的索引dict.put(c,j);ret=Math.max(ret,j-i);}return ret;}
}

 和python语言不同,java中的字典取值和存值,删除;

dict.get(key);
dict.remove(key);
dict.put(key,value);

2.串联所有单词的子串

枚举起始位置,按步长统计单词个数是否一致。

默认的字典是不会自动赋值的;

 out:是一个标签,用于continuebreak语句跳转到指定位置。

有汇编那味了。

感觉像复制字典;

Map<String, Integer> cur = new HashMap<>(cnts);

class Solution {public List<Integer> findSubstring(String s, String[] words) {Map<String,Integer> dict=new HashMap<>();for(String word:words){//统计单词数组中单词的个数dict.put(word,dict.getOrDefault(word,0)+1);}List<Integer>ret=new ArrayList<>();out://枚举起始位置,按步长统计单词个数是否一致。for(int i=0,step=words[0].length(),n=words.length;i<=s.length()-step*n;i++){//字典定义,复制了Map<String,Integer> cur=new HashMap<>(dict);for(int j=0;j<n;j++){String subStr=s.substring(i+step*j,i+step*(j+1));if(!cur.containsKey(subStr)){continue out;}else{int v=cur.get(subStr);if(--v==0){cur.remove(subStr);}else{cur.put(subStr,v);}}}ret.add(i);}return ret;}
}

 好像超时了。

另解

class Solution {public List<Integer> findSubstring(String s, String[] words) {int ls = s.length();            // 字符串s的长度int m = words.length;           // 总单词数量int n  = words[0].length();     // 单个单词长度List<Integer> res = new ArrayList<>();  // 结果数组if (ls < m * n){return res;     // 字符串s的长度小于所有单词拼接起来的长度,直接返回}// 枚举每一个切分单词的起点,共有[0, n-1]个起点for(int i = 0; i < n; i++){Map<String, Integer> diff = new HashMap<>();    // 记录滑动窗口中每个单词和words中对应单词的个数差值,diff为空,说明滑动窗口中的单词与word一致String w;   // 子串// 从起点i开始,将前m个子串单词加入哈希表,前m个单词就是首个滑动窗口里的单词; j表示第几个单词for(int j = 0; j < m && i + (j + 1) * n <= ls; j++){w = s.substring(i + j * n, i + (j + 1) * n);diff.put(w, diff.getOrDefault(w, 0) + 1);}// 遍历words,进行做差for(String word: words){diff.put(word, diff.getOrDefault(word, 0) - 1);if(diff.get(word) == 0){diff.remove(word);      // 单词数目为0,说明这个单词在滑动窗口和words的数目匹配,直接移除;}}// 移动这个长度固定为m*n的滑动窗口,左边界left为每个单词的起点,滑动窗口范围[left, left + m * n)for(int left = i; left <= ls - m * n; left += n){// 从第二个单词开始,开始要加入新单词,移除旧单词if(left > i){w = s.substring(left - n, left);    // 当前left的前一个单词是要移除的单词diff.put(w, diff.getOrDefault(w, 0) - 1);   // 滑动窗口中移除一个单词,相当于差值-1if(diff.get(w) == 0){diff.remove(w);}w = s.substring(left + (m - 1) * n, left + m * n);  // 右边界right = left + (m - 1) * n,为要加入滑动窗口的单词的起点diff.put(w, diff.getOrDefault(w, 0) + 1);   // 滑动窗口中加入一个单词,相当于差值+1if(diff.get(w) == 0){diff.remove(w);} }// diff为空,说明滑动窗口中的单词与word一致;left即为子串起点if(diff.isEmpty()){res.add(left);  }}}return res; }
}

3.最小覆盖子串

class Solution {public String minWindow(String s, String t) {//字符数组char [] s1=s.toCharArray();int m=s1.length;int retleft=-1;int retright=m;int [] cnts=new int[128];int [] cntt=new int[128];//cntt代表字符串t中每个字符c的出现次数for(char c:t.toCharArray()){cntt[c]++;}//int left=0;//cnts代表字符串s中每个字符的出现次数for(int right=0;right<m;right++){cnts[s1[right]]++;while(isCovered(cnts,cntt)){//更小的覆盖子串if(right-left<retright-retleft){retleft=left;retright=right;}//向右移动遍历cnts[s1[left]]--;left++;}}return retleft<0?"":s.substring(retleft,retright+1);}//通过统计字符出现次数的字典来判断cnts是否覆盖cnttprivate boolean isCovered(int [] cnts,int[] cntt){for(int i='A';i<='Z';i++){if(cnts[i]<cntt[i]){return false;}}for(int i='a';i<='z';i++){if(cnts[i]<cntt[i]){return false;}}return true;}
}

4.有效的数独

class Solution {public boolean isValidSudoku(char[][] board) {//不合格的数独其实就是某一行、某一列、某个方块中某个数字出现了不止一次。//那么我们一边遍历一边记录上述三个地方的数字标记为出现,遇到有相同数字存在直接返回false即可。int n=board.length;boolean [][] rows=new boolean[n][n],columns=new boolean[n][n],squares=new boolean[n][n];//取单元格int m=(int)Math.sqrt(n);for(int i=0;i<n;i++){for(int j=0;j<n;j++){if(board[i][j]=='.'){continue;}int num=board[i][j]-'1',sq=i/m*m+j/m;if(rows[i][num]||columns[j][num]||squares[sq][num]){return false;}rows[i][num]=columns[j][num]=squares[sq][num]=true;}}return true;}
}

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

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

相关文章

linux-应用层操作GPIO

GPIO 同样也是通过 sysfs 方式进行操控&#xff0c;进入到/sys/class/gpio 目录下&#xff0c; export&#xff1a;用于将指定编号的 GPIO 引脚导出。在使用 GPIO 引脚之前&#xff0c;需要将其导出&#xff0c;导出成功之后才能使用它。注意 export 文件是只写文件&#xff…

【C++】C/C++内存管理

目录 1. C/C内存分布 2. C语言中动态内存管理方式&#xff1a;malloc/calloc/realloc/free 3. C内存管理方式 3.1 new/delete操作内置类型 3.2 new和delete操作自定义类型 3.3new空间申请错误的处理 4. operator new与operator delete函数 4.1 operator new与operator d…

2024年10款专业的PDF合并工具帮你实现高效办公。

合并 PDF 文件还是有很多的优点的&#xff0c;比如能够方便查阅和管理&#xff0c;无需文件之间来回切换&#xff1b;方便系统的整理和分析文件&#xff1b;可以优化阅读体验并且节省存储空间等等。为了帮助大家进行文件合并&#xff0c;我还搜集了一些好用的工具在这里分享。 …

【JavaEE初阶 — 多线程】认识线程

目录 认识线程&#xff08;Thread&#xff09; 1 线程是什么? 2 为什么要有线程 3 进程和线程的区别 区别一 区别二 区别三 区别四 4. Java的线程和操作系统线程的关系 5.创建第一个多线程程序 引入Thread类 重写run() start()与run()区别 降低多线程对CPU的占用…

SpringBoot技术在商场应急管理中的创新应用

4系统概要设计 4.1概述 本系统采用B/S结构(Browser/Server,浏览器/服务器结构)和基于Web服务两种模式&#xff0c;是一个适用于Internet环境下的模型结构。只要用户能连上Internet,便可以在任何时间、任何地点使用。系统工作原理图如图4-1所示&#xff1a; 图4-1系统工作原理…

第三十四章 Vue路由进阶之声明式导航(导航高亮)

目录 一、导航高亮 1.1. 基于语法 1.2. 主要代码 二、声明式导航的两个类名 2.1. 声明式导航类名匹配方式 2.2. 声明式导航类名样式自定义 ​2.3. 核心代码 一、导航高亮 1.1. 基于语法 在Vue中通过VueRouter插件&#xff0c;我们可以非常简单的实现实现导航高亮效果…

基于Multisim数控直流稳压电源电路(含仿真和报告)

【全套资料.zip】数控直流稳压电源电路设计Multisim仿真设计数字电子技术 文章目录 功能一、Multisim仿真源文件二、原理文档报告资料下载【Multisim仿真报告讲解视频.zip】 功能 1.输出直流电压调节范围5-12V。 2.输出电流0-500mA。 3.输出直流电压能步进调节&#xff0c;步…

3D Gaussian Splatting 入门

1 摘要 3D Gaussian Splatting是一种将点云表示为高斯分布&#xff08;Gaussian Distributions&#xff09;的方法&#xff0c;用于3D重建、渲染等领域。这种方法通过在3D空间中对点云进行参数化&#xff0c;使得每个点不仅有位置&#xff08;XYZ坐标&#xff09;&#xff0c;还…

快速遍历包含合并单元格的Word表格

Word中的合并表格如下&#xff0c;现在需要根据子类&#xff08;例如&#xff1a;果汁&#xff09;查找对应的品类&#xff0c;如果这是Excel表格&#xff0c;那么即使包含合并单元格&#xff0c;也很容易处理&#xff0c;但是使用Word VBA进行查找&#xff0c;就需要一些技巧。…

微服务系列四:热更新措施与配置共享

目录 前言 一、基于Nacos的管理中心整体方案 二、配置共享动态维护 2.1 分析哪些配置可拆&#xff0c;需要动态提供哪些参数 2.2 在nacos 分别创建共享配置 创建jdbc相关配置文件 创建日志相关配置文件 创建接口文档配置文件 2.3 拉取本地合并配置文件 2.3.1 拉取出现…

抖音短剧小程序上线:短视频平台的全新娱乐体验

抖音短剧小程序的开发是一个结合了创意与技术的过程&#xff0c;旨在通过简洁而富有吸引力的方式&#xff0c;向用户提供高质量的短剧内容。随着移动互联网的快速发展&#xff0c;短视频平台成为了人们日常生活中不可或缺的一部分&#xff0c;而短剧作为一种新兴的内容形式&…

【解决】Ubuntu18.04 卸载python之后桌面异常且终端无法打开,重启后进入tty1,没有图形化界面

我因为python版本太过于混乱 &#xff08;都是为了学习os&#xff09; &#xff0c;3.6—3.9版本我都安装了&#xff0c;指向关系也很混乱&#xff0c;本着“重装是最不会乱”的原则&#xff0c;我把全部版本都卸载了。然后装了3.9 发现终端打不开了&#xff0c;火狐浏览器的图…

Golang | Leetcode Golang题解之第521题最长特殊序列I

题目&#xff1a; 题解&#xff1a; func findLUSlength(a, b string) int {if a ! b {return max(len(a), len(b))}return -1 }func max(a, b int) int {if b > a {return b}return a }

【英特尔IA-32架构软件开发者开发手册第3卷:系统编程指南】2001年版翻译,2-13

文件下载与邀请翻译者 学习英特尔开发手册&#xff0c;最好手里这个手册文件。原版是PDF文件。点击下方链接了解下载方法。 讲解下载英特尔开发手册的文章 翻译英特尔开发手册&#xff0c;会是一件耗时费力的工作。如果有愿意和我一起来做这件事的&#xff0c;那么&#xff…

二叉树中的深搜 算法专题

二叉树中的深搜 一. 计算布尔二叉树的值 计算布尔二叉树的值 class Solution {public boolean evaluateTree(TreeNode root) {if(root.left null) return root.val 0? false: true;boolean left evaluateTree(root.left);boolean right evaluateTree(root.right);return…

VisionPro —— CogPatInspectTool对比工具

一、CogPathInspectTool工具简介 CogPathInspectTool是VisionPro重要的工具&#xff0c;主要用于缺陷检测&#xff0c;通过将当前图像与“训练图像”对比&#xff0c;获取“原始差异图像”&#xff0c;再将“原始差异图像”与“阈值图像”进行对比&#xff0c;进而获取“阈值差…

Linux 系统启动

1.Linux系统启动过程 Linux系统启动过程可以分为5个阶段&#xff1a;内核的引导、运行 init、系统初始化、建立终端、用户登录系统。 2.内核引导 当计算机打开电源后&#xff0c;首先是BIOS开机自检&#xff0c;按照BIOS中设置的启动设备&#xff08;通常是硬盘&#xff09;来启…

Qt 坐标系统与坐标变换

Qt 坐标系统与坐标变换 坐标变换函数 QPainter坐标变换相关函数 分组函数原型功能坐标变换void translate(qreal dx,qreal dy)坐标系统一定的偏移量&#xff0c;坐标原点平移到新的点void rotate(qreal angle)坐标系统顺时针旋转-一个角度void scale(qreal sx,qreal sy)坐标…

奥数与C++小学四年级(第十六题 魔法学院)

参考程序代码&#xff1a; #include <iostream>int main() {int maxStudentsPerSubject 9; // 每个科目最多有9个比哈利高的学生int students maxStudentsPerSubject * 3; // 三个科目// 加上哈利自己int totalStudents students 1;std::cout << "最大学…

高空作业未系安全带监测系统 安全带穿戴识别预警系统

在各类高空作业场景中&#xff0c;安全带是保障作业人员生命安全的关键防线。然而&#xff0c;由于人为疏忽或其他原因&#xff0c;作业人员未正确系挂安全带的情况时有发生&#xff0c;这给高空作业带来了巨大的安全隐患。为有效解决这一问题&#xff0c;高空作业未系安全带监…