leetcode - 串联所有单词的子串 - 最小覆盖子串 - x 的平方根

news2025/1/11 23:54:46

I30. 串联所有单词的子串 - 力扣(LeetCode)

给定一个字符串 s 和一个字符串数组 words words 中所有字符串 长度相同

 s 中的 串联子串 是指一个包含  words 中所有字符串以任意顺序排列连接起来的子串。

  • 例如,如果 words = ["ab","cd","ef"], 那么 "abcdef", "abefcd""cdabef", "cdefab""efabcd", 和 "efcdab" 都是串联子串。 "acdbef" 不是串联子串,因为他不是任何 words 排列的连接。

返回所有串联子串在 s 中的开始索引。你可以以 任意顺序 返回答案。

示例 1:

输入:s = "barfoothefoobarman", words = ["foo","bar"]
输出:[0,9]
解释:因为 words.length == 2 同时 words[i].length == 3,连接的子字符串的长度必须为 6。
子串 "barfoo" 开始位置是 0。它是 words 中以 ["bar","foo"] 顺序排列的连接。
子串 "foobar" 开始位置是 9。它是 words 中以 ["foo","bar"] 顺序排列的连接。
输出顺序无关紧要。返回 [9,0] 也是可以的。
示例 2:

输入:s = "wordgoodgoodgoodbestword", words = ["word","good","best","word"]
输出:[]
解释:因为 words.length == 4 并且 words[i].length == 4,所以串联子串的长度必须为 16。
s 中没有子串长度为 16 并且等于 words 的任何顺序排列的连接。
所以我们返回一个空数组。
示例 3:

输入:s = "barfoofoobarthefoobarman", words = ["bar","foo","the"]
输出:[6,9,12]
解释:因为 words.length == 3 并且 words[i].length == 3,所以串联子串的长度必须为 9。
子串 "foobarthe" 开始位置是 6。它是 words 中以 ["foo","bar","the"] 顺序排列的连接。
子串 "barthefoo" 开始位置是 9。它是 words 中以 ["bar","the","foo"] 顺序排列的连接。
子串 "thefoobar" 开始位置是 12。它是 words 中以 ["the","foo","bar"] 顺序排列的连接。
 

这个题目就是 找到字符串中所有字母异位词 这个题目的升级版,具体可以看一下博客:
leetcode 刷题 - 最大连续1的个数 - 将 x 减到 0 的最小操作数 - 水果成篮 - 找到字符串中所有字母异位词-CSDN博客

其实就是把 找到字符串中所有字母异位词 这个题目 当中的 字符换成了 字符串。

所以,其实基本思想还是和 找到字符串中所有字母异位词 这个题目 一样的,只不过,hash表不能再用 数组来模拟了,要使用 hash容器。

而且,left 和 right 迭代器方式也不再是一步一步的向后移动了,而是一个子串的一个子串的移动。

而且,在这个题目当中,滑动窗口的 起始位置可能不是 从数组的最开始位置开始的,可能从 第二,第三··· 都有可能,但是,如果超过了 words 数组当中一个子串的 大小,那么后续就会是重复的。

所以,我们的滑动窗口,不能像 之前题目当中,只滑动一遍数组,而是要滑动 len 次数组(其实位置依次往后移一个字符),len就是words 当中子串的字符个数。

完整代码:

class Solution
{
public:
    vector<int> findSubstring(string s, vector<string>& words)
    {
        vector<int> ret;
        unordered_map<string, int> hash1; // 保存 words ⾥⾯所有单词的频次
        for (auto& s : words) hash1[s]++;
        int len = words[0].size(), m = words.size();
        for (int i = 0; i < len; i++) // 执⾏ len 次
        {
            unordered_map<string, int> hash2; // 维护窗⼝内单词的频次
            for (int left = i, right = i, count = 0; right + len <= s.size();
                right += len)
            {
                // 进窗⼝ + 维护 count
                string in = s.substr(right, len);
                hash2[in]++;
                if (hash1.count(in) && hash2[in] <= hash1[in]) count++;
                // 判断
                if (right - left + 1 > len * m)
                {
                    // 出窗⼝ + 维护 count
                    string out = s.substr(left, len);
                    if (hash1.count(out) && hash2[out] <= hash1[out]) count--;
                    hash2[out]--;
                    left += len;
                }
                // 更新结果
                if (count == m) ret.push_back(left);
            }
        }
        return ret;
    }
};

I76. 最小覆盖子串 - 力扣(LeetCode)

给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 "" 。

注意:

  • 对于 t 中重复字符,我们寻找的子字符串中该字符数量必须不少于 t 中该字符数量。
  • 如果 s 中存在这样的子串,我们保证它是唯一的答案。
示例 1:

输入:s = "ADOBECODEBANC", t = "ABC"
输出:"BANC"
解释:最小覆盖子串 "BANC" 包含来自字符串 t 的 'A'、'B' 和 'C'。
示例 2:

输入:s = "a", t = "a"
输出:"a"
解释:整个字符串 s 是最小覆盖子串。
示例 3:

输入: s = "a", t = "aa"
输出: ""
解释: t 中两个字符 'a' 均应包含在 s 的子串中,
因此没有符合条件的子字符串,返回空字符串。

 其实这个题目,和上述所说的两个题目是类似的,只不过在判断条件当中,上两个题目是 当 窗口不合法,然后出窗口,但是这个题目是 窗口合法,就更新结果,然后出窗口。

同样的,使用 left 和 right 两个指针,从开始来进行遍历,用两个 hash 表分别存储 s 和 t 两个字符串当中 各个 字符的数量。

right 依次向后走,把遍历的 每一个 s 当中的字符,记录在 自己 hash 表当中,也就是 hash 表当中计数器++。(进窗口)

当 right 向后迭代,窗口合法,就更新结果,然后 循环 left++,向后迭代,同样的,left 遍历的过的字符 来 出窗口,在 hash 的计数器--。一直left++ 到 窗口不合法。

判断两个 s 相对于 t 当中的在  t 当中在 s 当中存在的字符 的个数,要大于等于 t 当中对应字符的 数量,才称之为 s 当中的这个字符是 有效字符。

当有效字符 等于 t 当中字符种类数量,才认为 当前窗口合法。

判断 两个 hash 表 是否相等,可以使用上述 有效字符 的方式进行优化,具体就是:

我们可以用一个 count 记录 有效字符。什么是 有效字符呢?就是在我们所寻找的子串当中,有多少 种类 的字符,是和 目标字符是 一样的。如果有一个 种类 是一样的,count++。

所以,在 存储我们找出的子串当中 各个字符出现次数 的 hash 表当中,依旧按照 滑动窗口 当中的逻辑,进行 计数,只不过,如果是  和 目标字符 hash 当中有重复的,也就是当前的 计数器++ 的是 有效字符,那么就 count++。

当 count == 目标子串.size() 之时,采取更新结果,否则,当前找出的 这个子串 就不满足条件。
 

完整代码:

class Solution {
public:
    string minWindow(string s, string t) {
        char hash_s[128] = {0}; // 用于存储 s 字符串当中 各个字符出现的次数
        char hash_t[128] = {0}; // 用于存储 t 字符串当中 各个字符出现的次数

    //记录t字符种类数量 当前最小长度       当前最小程度的子串在 s 当中的起始位置
        int kinds = 0, minlen = INT_MAX, begin = -1;
        for(auto& e : t) if(hash_t[e]++ == 0) kinds++;

        for(int left = 0, right = 0, count = 0; right < s.size();right++)
        {
            char right_str = s[right]; // 取出当前 right 指向的字符
            hash_s[right_str]++;       // 哈希表计数器++
            if(hash_s[right_str] == hash_t[right_str]) count++; // 如果在上述计数器++之后
                                                                // 满足条件,count++
            // 如果当前 s 当中的有效字符 和 t 当中的 字符种类相等
            // 说明当前窗口 合法
            // 更新结果,循环一直 left++, 直到 窗口不再合法
            while(count == kinds)
            {
                if(right - left + 1 < minlen)
                {
                    minlen = right - left + 1;
                    begin = left;
                }
                
                char left_str = s[left++];// 取出当前 left 指向的字符,然后 left++
                if(hash_s[left_str] == hash_t[left_str]) count--; //如果left指向字符出窗口之后
                                                                  // 当前字符个数不在和t相比是
                                                                  // 大于等于 t 对应字符数量
                hash_s[left_str]--;
            }
        }

        if(begin == -1) return "";
        else return s.substr(begin, minlen); // 如果有结果,就切割字符串,然后返回
    }
};

I69. x 的平方根 - 力扣(LeetCode)

给你一个非负整数 x ,计算并返回 x 的 算术平方根 。

由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。

注意:不允许使用任何内置指数函数和算符,例如 pow(x, 0.5) 或者 x ** 0.5 。

示例 1:

输入:x = 4
输出:2
示例 2:

输入:x = 8
输出:2
解释:8 的算术平方根是 2.82842..., 由于返回类型是整数,小数部分将被舍去。
 

 完整代码:
 

class Solution {
public:
    int mySqrt(int x) {
        if(x < 1) return 0; // 处理边界情况

        int left = 1, right = x;
        while(left < right)
        {
            // 找到 left 和 right 的中间数值
            long long mid = left +  (right - left + 1) / 2; //  long long防止 mid * mid 溢出
            if(mid * mid <= x) left = mid;  // 刷新 左右区间
            else right = mid -1;
        }
        return left;

    }
};

I【模板】前缀和_牛客题霸_牛客网 (nowcoder.com)

描述

给你一个 n 行 m 列的矩阵 A ,下标从1开始。

接下来有 q 次查询,每次查询输入 4 个参数 x1 , y1 , x2 , y2

请输出以 (x1, y1) 为左上角 , (x2,y2) 为右下角的子矩阵的和,

输入描述:

第一行包含三个整数n,m,q.

接下来n行,每行m个整数,代表矩阵的元素

接下来q行,每行4个整数x1, y1, x2, y2,分别代表这次查询的参数

 

输出描述:

输出q行,每行表示查询结果。

示例1
输入:
3 4 3
1 2 3 4
3 2 1 0
1 5 7 8
1 1 2 2
1 1 3 3
1 2 3 4
复制
输出:
8
25
32

使用前缀和 -> 快速求出数组当中某一个连续区间的和

先要预处理出来一个前缀和数组(dp数组),dp[i] 元素存储的是 原数组当中从起始位置,到 i 位置 这个连续区间当中 元素之和

所以,在以后 寻找的过程当中,只需要以 下标对应 dp 当中存储的和,相减即可。比如 :给定区间 [1, 3] ,那么这个区间当中的和就等于 dp[3] - dp[1]

完整代码:

#include <iostream>
#include<vector>
using namespace std;

int main() {
    int n,q;
    cin >> n >> q;
    vector<int> arr(n + 1);
    vector<long long> dp(n + 1, 0); // long long 防止溢出

    for(int i = 1;i <= n;i++) cin >> arr[i];
    for(int i = 1;i <= n;i++) dp[i] = dp[i - 1] + arr[i];

    int l , r;
    while(q--)
    {
        cin >> l >> r;
        cout << dp[r] - dp[l - 1] << endl;
    }

    return 0;
}

I【模板】二维前缀和_牛客题霸_牛客网 (nowcoder.com)

描述

给你一个 n 行 m 列的矩阵 A ,下标从1开始。

接下来有 q 次查询,每次查询输入 4 个参数 x1 , y1 , x2 , y2

请输出以 (x1, y1) 为左上角 , (x2,y2) 为右下角的子矩阵的和,

输入描述:

第一行包含三个整数n,m,q.

接下来n行,每行m个整数,代表矩阵的元素

接下来q行,每行4个整数x1, y1, x2, y2,分别代表这次查询的参数

输出描述:

输出q行,每行表示查询结果。

示例1
输入:
3 4 3
1 2 3 4
3 2 1 0
1 5 7 8
1 1 2 2
1 1 3 3
1 2 3 4
复制
输出:
8
25
32

和上述一样,使用 前缀和 来解决上述的问题。

dp[i][j] 表示,从 [1,1] 位置到 [i,j] 位置,这段区间当中所有的元素的和。

但是,dp 这个二维数组不好求,如果我们直接遍历来一个一个求的话,时间复杂度很高。

所以,其实 dp[i][j] 其实就是 A + B + C + D,这四个之和。单独求 A 其实很好求,找到 i -1 和 j -1 ,位置,就可以求出 dp[i-1][j-1] 就是 A 的面积。

因为单独求 C 和 B 不好求。

 A + B + C + D = (A + B) + (A + C) + D - A

 上述 (A + B) 和 (A + C) 就可以求出。

 所以 : dp[ i ][ j ] = dp[ i-1 ][ j ] + dp[ i ][ j-1 ] + arr[ i ][ j ] +dp[ i-1 ][ j-1 ]  

所以:

完整代码:

#include <iostream>
#include<vector>
using namespace std;

int main() {
    int n = 0, m = 0, q = 0;
    cin >> n >> m >> q;
    vector<vector<int>> arr(n + 1, vector<int>(m + 1));
    for(int i = 1; i <= n; i++)
        for(int j = 1; i <= m ;j++)
            cin >> arr[i][j];

    vector<vector<long long>> dp(n + 1, vector<long long>(m + 1));
    for(int i = 1; i <= n; i++)
        for(int j = 1; i <= m ;j++)
            dp[i][j] = dp[i - 1][j] + dp[i][j - 1] + arr[i][j] - dp[i - 1][j - 1];

    int x1 , y1 , x2 , y2;
    while(q--)
    {
        cin >> x1 >> y1 >> x2 >> y2;
        cout << dp[x2][y2] - dp[x1 - 1][y2] - dp[x2][y1 - 1] + dp[x1 - 1][y1 - 1] << endl;
    }

    return 0;
}

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

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

相关文章

卡方检验-python代码

故事背景 问题 卡方检验的结果怎么计算&#xff1f; 方法 python代码 import numpy as np from scipy.stats import chi2_contingency# 观察频数矩阵 observed np.array([[47, 21, 17],[63, 29, 15],[11, 2, 4]])# 进行卡方检验 chi2, p, dof, expected chi2_contingency(o…

电子器件系列44:环形线圈电感

干货&#xff01;电感最重要、最常见的几个作用_线圈 环形线圈电感的原理&#xff1a; 电感中包含了哪三个物理学定律&#xff0c;为什么它能以磁场形式储能_哔哩哔哩_bilibili 电感的基本原理_哔哩哔哩_bilibili 环形线圈电感的作用: 1.储能器&#xff1a; 环形线圈电感能够…

Neo4j安装(Docker中安装Neo4j)

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

【漏洞复现】用友U8-Cloud 存在任意文件上传漏洞

漏洞描述 U8 cloud 聚焦成长型、创新型企业的云 ERP,基于全新的企业互联网应用设计理念,为企业提供集人财物客、产供销于一体的云 ERP 整体解决方案,全面支持多组织业务协同、智能财务,人力服务、构建产业链智造平台,融合用友云服务实现企业互联网资源连接、共享、协同。…

Windows 安装 汉化版 burp suite

注&#xff1a;个人笔记&#xff0c;仅供参考。 burpsuite 软件下载链接&#xff1a; https://www.alipan.com/s/cWxMF5S9sq4 提取码: 31ut 注&#xff1a;安装路径不要有中文 安装 配置 Java 环境 因为burpsuite是在JAVA环境下运行的&#xff0c;所以首先应该配置好JAVA环…

浙大恩特客户资源管理系统 SQL注入漏洞复现

0x01 产品简介 浙大恩特客户资源管理系统是一款针对企业客户资源管理的软件产品。该系统旨在帮助企业高效地管理和利用客户资源&#xff0c;提升销售和市场营销的效果。 0x02 漏洞概述 浙大恩特客户资源管理系统中T0140_editAction.entweb接口处存在SQL注入漏洞&#xff0c;未…

解决Error:java: System Java Compiler was not found in classpath

解决Error:java: System Java Compiler was not found in classpath 一、配置maven 注意:我的C盘比较大直接配置在了C盘&#xff0c;建议配置到其他盘&#xff0c;记得做maven环境变量配置 二、卸载本地JDK&#xff0c;换个版本安装配置环境变量 重启电脑或idea&#xff0c;…

React经典初级错误

文章 前言错误场景问题分析解决方案后言 前言 ✨✨ 他们是天生勇敢的开发者&#xff0c;我们创造bug&#xff0c;传播bug&#xff0c;毫不留情地消灭bug&#xff0c;在这个过程中我们创造了很多bug以供娱乐。 前端bug这里是博主总结的一些前端的bug以及解决方案&#xff0c;感兴…

Linux环境下C++ 接入OpenSSL

接上一篇&#xff1a;Windows环境下C 安装OpenSSL库 源码编译及使用&#xff08;VS2019&#xff09;_vs2019安装openssl_肥宝Fable的博客-CSDN博客 解决完本地windows环境&#xff0c;想赶紧在外网环境看看是否也正常。毕竟现在只是HelloWorld级别的&#xff0c;等东西多了&am…

如何在latex中高亮文本

导入soul 包可以使用高亮功能 在文本中插入 \hl{} 即可 导入color 包可以使用颜色功能 color 也可以替换成 xcolor \documentclass{report} \usepackage{xcolor,soul} \begin{document}\textcolor{red}{Text}\hl{Text} \hl{\textbf{Text}} \textbf{\textcolor{red}{\hl{Text}…

PyTorch深度学习原理与实现

PyTorch深度学习原理与实现 1. 引言 深度学习发展历程 感知机网络&#xff08;解决线性可分问题&#xff0c;20世纪40年代&#xff09; BP神经网络&#xff08;解决线性不可分问题&#xff0c;20世纪80年代&#xff09; 深度神经网络&#xff08;海量图片分类&#xff0c;2…

Nginx 可视化管理平台:nginx-proxy-manager

本心、输入输出、结果 文章目录 Nginx 可视化管理平台:nginx-proxy-manager前言nginx-proxy-managernginx-proxy-manager 特性快速开始使用 Docker 网络开启 Docker 健康检查相关可视化页面相关链接弘扬爱国精神Nginx 可视化管理平台:nginx-proxy-manager 编辑:简简单单 Onl…

虚拟化热添加技术在数据备份上的应用

虚拟化中的热添加技术主要是指&#xff1a;无需停止或中断虚拟机的情况下&#xff0c;在线添加物理资源&#xff08;如硬盘、内存、CPU、网卡等&#xff09;的技术。热添加技术也是相比物理机一个非常巨大的优势&#xff0c;其使得资源分配变得更加灵活。 虚拟化中的热添加技术…

Unity优化(1)——合并Mesh的两种方法

在某些移动端项目中&#xff0c;对于DrawCall的要求是很严格的&#xff0c;我们一般查看DrawCall可以通过Statistics里面的Batches进行查看&#xff0c;一般对于移动设备的Batches要控制在200左右比较合适&#xff0c;所以降低Batches是很重要的。 我们常常会遇到一个物体下挂载…

【AI视野·今日Sound 声学论文速览 第三十五期】Fri, 27 Oct 2023

AI视野今日CS.Sound 声学论文速览 Fri, 27 Oct 2023 Totally 8 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Sound Papers Controllable Generation of Artificial Speaker Embeddings through Discovery of Principal Directions Authors Florian Lux, Pascal T…

kubernetes集群编排——k8s高可用集群

实验环境 主机名 IP 角色 k8s1 192.168.92.11 harbor k8s2 192.168.92.12 control-plane k8s3 192.168.92.13 control-plane k8s4 192.168.92.14 control-plane k8s5 192.168.92.15 haproxy,pacemaker k8s6 192.168.92.16 haproxy,pacemaker k8s7 192.16…

03-瑞吉外卖关于菜品/套餐分类表的增删改查

新增菜品/套餐分类 页面原型 当我们在后台系统中添加菜品/套餐时,需要选择一个菜品/套餐分类,在移动端也会按照菜品分类和套餐分类来展示对应的菜品和套餐 第一步: 用户点击确定按钮执行submitForm函数发送Ajax请求,将新增菜品/套餐表单中输入的数据以json形式提交给服务端,…

(1)(1.16) Maxbotix I2C声纳

文章目录 前言 1 连接到Pixhawk 2 通过Mission Planner进行设置 3 测试传感器 4 参数说明 前言 Maxbotix I2C EZ4 声纳&#xff08;又称 I2CXL-MaxSonar-EZ4 或 MB1242&#xff09;是一种相对便宜的短距离&#xff08;最多 7m&#xff09;测距仪&#xff0c;主要设计用于…

为什么鸿蒙调用弹窗组件(CommonDialog )却不展示或闪退?

鸿蒙OS开发问题 1.效果展示2.问题代码3.问题分析4.完整代码 1.效果展示 1.为什么调用弹窗不展示会闪退? 2.问题代码 1.前端代码: <?xml version"1.0" encoding"utf-8"?> <DirectionalLayoutxmlns:ohos"http://schemas.huawei.com/res/…

提前占领高地!2024年值得期待的UI设计原型图软件推荐

UI设计原型图软件对于产品经理、设计师来说是效率神器。一款专业的UI设计原型图软件能够帮助产品经理、设计师高效且快速地创建精美且实用的UI用户界面&#xff0c;从而提升UI用户界面的产品价值。本篇文章将推荐10款2024年好用的UI设计原型图软件&#xff0c;以帮助你更好地选…