【面试经典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);   // 滑动窗口中移除一个单词,相当于差值-1
                    if(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);   // 滑动窗口中加入一个单词,相当于差值+1
                    if(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是否覆盖cntt
    private 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;
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ArcGIS影像调色(三原色)三原色调整

本期主要介绍ArcGIS影像调色&#xff08;三原色&#xff09; ArcGIS影像调色&#xff08;三原色&#xff09;&#xff0c;对比度、亮度、gamma。红绿蓝三原色调整。 视频学习 ArcGIS影像调色&#xff08;三原色&#xff09;

默认路由:实现内网所有网段流量走一条默认路由访问外网

默认路由 Tip&#xff1a;默认路由一般指出口网关设备的出口路由。实现所有网段流量都走一条路由。 实验模拟&#xff1a;公司内部pc 通过出口网关 访问运营商内部 baidu服务 isp网关配置&#xff1a; <Huawei>sy Enter system view, return user view with CtrlZ. …

Linux SSH免密登入以及配置脚本

一、ssh原理简单介绍 客户端生成一对公钥和私钥&#xff0c;并将自己的公钥发送到服务器上 其中公钥用来加密&#xff0c;私钥用来解密。 二、ssh免密登入实现步骤详解 我这就以服务器controller和客户端compute来做为例子 2.1、首先在controller上输入ssh-keygen -t rsa …

【大数据学习 | kafka】producer之拦截器,序列化器与分区器

1. 自定义拦截器 interceptor是拦截器&#xff0c;可以拦截到发送到kafka中的数据进行二次处理&#xff0c;它是producer组成部分的第一个组件。 public static class MyInterceptor implements ProducerInterceptor<String,String>{Overridepublic ProducerRecord<…

使用Mac如何才能提高OCR与翻译的效率

OCR与截图大家都不陌生&#xff0c;或许有的朋友对于这两项功能用到的不多&#xff0c;但是如果经常会用到的话&#xff0c;那你就该看看了 iOCR&#xff0c;快捷键唤出翻译窗口&#xff0c;不论是截图翻译、划词翻译、输入翻译、剪切板翻译&#xff0c;统统快捷键完成&#x…

Java面向对象 C语言字符串常量

1. &#xff08;1&#xff09;. package liujiawei;public class Phone {String brand;double price;public void call(){System.out.println("手机打电话");}public void play(){System.out.println("手机打游戏");} } public class phonetest {public…

Halcon-模板匹配(WPF)

halcon的代码 dev_open_window (0, 0, 512, 512, black, WindowHandle) read_image (Image, C:/Users/CF/Desktop/image.jpg) dev_display (Image)draw_rectangle1 (WindowHandle, Row1, Column1, Row2, Column2) gen_rectangle1 (Rectangle, Row1, Column1, Row2, Column2) r…

Day02 C++ 环境设置

2024.11.1 C 环境设置 如果您想要设置 C 语言环境&#xff0c;需要确保电脑上有以下两款可用的软件&#xff0c;文本编辑器和 C 编译器。 一、文本编辑器 通过编辑器创建的文件通常称为源文件&#xff0c;源文件包含程序源代码。 C 程序的源文件通常使用扩展名 .cpp、.cp 或…

c++拷贝构造函数

1.拷贝构造函数 拷贝构造函数的调用时机 class A { public://默认构造函数A(){m_Hp 100;cout << "A默认构造函数调用完毕" << endl;}//有参构造函数A(int hp){m_Hp hp;cout << "A有参构造函数调用完毕" << endl;}A(const A&…

Node.js 完全教程:从入门到精通

Node.js 完全教程&#xff1a;从入门到精通 Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境&#xff0c;允许开发者在服务器端使用 JavaScript。它的非阻塞 I/O 和事件驱动架构使得 Node.js 非常适合于构建高性能的网络应用。本文将详细介绍 Node.js 的安装、基本语…

C++STL——list

C教学总目录 list 1、list简介2、构造函数3、迭代器4、访问和容量函数5、修改类函数6、操作类函数 1、list简介 list是带头双向循环链表&#xff0c;也是模板类&#xff0c;使用时要指明类型&#xff0c;包含于头文件<list> 由于list是双向循环链表&#xff0c;在任意位置…

大数据计算里的-Runtime Filter

文章目录 Runtime Filter示例 Runtime Filter 从纸面意义来看&#xff0c;就是程序在运行时&#xff0c;根据实际的数据去进行一些过滤操作。这和静态的规则优化不同&#xff0c;静态优化不考虑实现的数据的分布。 示例 select a.* ,b.* a join b on a.idb.id假设一下数据…

SD教程 ControlNet 之MLSD 室内设计

你是否已经厌倦了传统的室内设计方式&#xff0c;想探索新方法来增强作品设计感&#xff1f;本期小编就同大家分享一个新武器&#xff0c;用Stable Diffusion的ControlNet来打造一个室内设计全新工作流。无论你是经验丰富的室内设计师还是初学小白&#xff0c;都将使你的日常工…

蓬勃发展:移动开发——关于软件开发你需要知道些什么

一、前言 移动开发一直都是软件开发领域中最有趣的领域之一&#xff0c;这是因为&#xff1a; 1、移动开发为“只有一个人”的开发团队提供了一个非常独特的机会&#xff0c;让他可以在相对较短的时间内建立一个实际的、可用的、有意义的应用程序&#xff1b; 2、移动开发也代…

性能测试 —— MySQL性能测试方案设计!

01、慢查询 查看是否开启慢查询 mysql> show variables like %slow%’; 如图所示&#xff1a; 系统变量log_slow_admin_statements 表示是否将慢管理语句例如ANALYZE TABLE和ALTER TABLE等记入慢查询日志 启用log_slow_extra系统变量 &#xff08;从MySQL 8.0.14开始提…

每日OJ题_牛客_爱吃素_数学_C++_Java

目录 牛客_爱吃素_数学 题目解析 C代码 Java代码 牛客_爱吃素_数学 爱吃素 (nowcoder.com) 描述&#xff1a; 牛妹是一个爱吃素的小女孩&#xff0c;所以很多素数都害怕被她吃掉。 一天&#xff0c;两个数字aaa和bbb为了防止被吃掉&#xff0c;决定和彼此相乘在一…

Vue 自定义icon组件封装SVG图标

通过自定义子组件CustomIcon.vue使用SVG图标&#xff0c;相比iconfont下载文件、重新替换更节省时间。 子组件包括&#xff1a; 1. Icons.vue 存放所有SVG图标的path 2. CustomIcon.vue 通过icon的id索引对应的图标 使用的时候需要将 <Icons></Icons> 引到使用的…

MySQL-如果你在添加外键时忘加约束名,如何找到系统默认的约束名

问题 在你添加约束的时候&#xff0c;一般都会为其取名以方便后期的修改&#xff0c;但是如果你忘记了呢&#xff0c;如何找到系统默认的约束名 解决方法 -- 查找约束名 SELECTCONSTRAINT_NAME FROMINFORMATION_SCHEMA.KEY_COLUMN_USAGE WHERETABLE_NAME emp ANDREFERENCED_T…

KP8530X系列KP85301SGA 650V耐压 集成自举二极管的半桥栅极驱动器 北欧双线灯调色解决方案

KP8530X同系列选型参考&#xff1a; KP85301SGA兼容IR2103 KP85302SGA兼容IR2106、IR2001、IR2005、IR2186 KP85303SGA兼容IR2104 KP85304SGA兼容IR2304 KP85305SGA兼容IR21857 KP8530X系列KP85301SGA是一款 650V 耐压&#xff0c;集成自举二极管的半桥栅极驱…

IPC-A-610J-中文版 CHINESE-中文版 2024 电子组件的可接受性

IPC-A-610J-中文版 CHINESE-中文版 2024 电子组件的可接受性.pdf 链接: https://pan.baidu.com/s/1UreAzlB_P7tGH_WoFL2Ybg?pwd1234 提取码: 1234 https://share.weiyun.com/eQCyAPYh 通过网盘分享的文件&#xff1a;IPC-A-610J-中文版 CHINESE-中文版 2024 电子组件的可接受性…