当前位置: 首页 > news >正文

哪里有网站建设服务/小程序制作一个需要多少钱

哪里有网站建设服务,小程序制作一个需要多少钱,博物馆网站建设,自适应网站建设都找全网天下76. 最小覆盖子串 给你一个字符串 s s s、一个字符串 t t t。返回 s s s 中涵盖 t t t 所有字符的最小子串。如果 s s s 中不存在涵盖 t t t 所有字符的子串,则返回空字符串 ‘ ‘ " \quad" ‘‘" 。 注意: 对于 t t t 中重复…

76. 最小覆盖子串

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

注意:

  • 对于 t t t 中重复字符,我们寻找的子字符串中该字符数量必须不少于 t t t 中该字符数量;
  • 如果 s s 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 的子串中,
因此没有符合条件的子字符串,返回空字符串。

个人解题思路:

我们可以利用“滑动窗口”的思想来解决这个问题。 具体步骤如下:

初始化:

  • 创建一个字典 remaining_target,记录字符串 t 中每个字符的出现次数。
  • 定义两个指针 indextemp_index,表示当前窗口的左右边界。
  • 定义变量 current_substring,用于记录当前窗口的子串。
  • 定义变量 min_substring,用于记录最小子串。
  • 定义变量 min_substring_length,用于记录最小子串的长度。
  • 定义布尔变量 found_all_chars,表示是否已找到目标字符串的所有字符。

遍历字符串:

代码首先初始化了目标字符串 t 的临时变量 remaining_target,并设置了变量来记录当前子串和最小子串。接着,代码遍历源字符串 s,对每个字符进行判断它是否在 remaining_target 中。如果在,则表示找到了目标字符串中的一个字符,remaining_target 中对应字符的数量减一。当在s 中找到第一个 t 的元素时,代码记录下当前的索引 temp_index,以备后续滑动index使用。 在遍历过程中,代码不断更新当前子串 current_substring,并在满足条件时更新最小子串 min_substring。当 remaining_target 的长度为零时,说明当前窗口已经包含了目标字符串的所有字符,代码会通过调整索引来优化子串的长度。最终,代码返回找到的最小子串。

python代码:

class Solution:def minWindow(self, s: str, t: str) -> str:# 初始化目标字符串的副本remaining_target = t# 初始化当前子串和最小子串current_substring = ''min_substring = ''min_substring_length = len(s)# 标记是否已找到目标字符串的所有字符found_all_chars = Falseindex = 0# 如果源字符串的长度小于目标字符串,直接返回空字符串if len(s) < len(t):return ''# 遍历源字符串while index < len(s):current_char = s[index]index += 1# 如果当前字符在目标字符串中if current_char in remaining_target:found_all_chars = True# 删除目标字符串中对应的字符remaining_target = remaining_target.replace(current_char, '', 1)# 如果目标字符串中剩余字符的长度为目标字符串长度减一,记录当前索引if len(remaining_target) == len(t) - 1:temp_index = index# 如果已找到目标字符串的所有字符if found_all_chars:current_substring += current_char  # 将当前字符添加到当前子串# 如果目标字符串的所有字符都已找到且当前子串长度小于最小子串长度if len(remaining_target) == 0 and len(current_substring) <= min_substring_length:min_substring = current_substringmin_substring_length = len(min_substring)# 如果目标字符串的所有字符都已找到if len(remaining_target) == 0:index = temp_indexremaining_target = tfound_all_chars = Falsecurrent_substring = ''return min_substring

时间复杂度:

  • 时间复杂度: O ( n ) O(n) O(n) 其中 n 是字符串 s s s 的长度。
    由于每个字符最多被指针 index 访问一次,因此时间复杂度为 O ( n ) O(n) O(n)
  • 空间复杂度: O ( k ) O(k) O(k) 其中 k 是字符集 t t t 的大小。
    需要额外的空间来存储字符串 remaining_targetcurrent_substring,其大小与字符集的大小成正比。

结果

python3的代码在用例165/168处提示超时,因此我用deepseek将代码转成了C++的形式提交了。以下是C++的提交结果和代码(C++的代码我没有检查):
请添加图片描述

#include <string>
#include <unordered_map>
#include <algorithm>class Solution {
public:std::string minWindow(std::string s, std::string t) {// 统计 t 中每个字符的出现次数std::unordered_map<char, int> t_count;for (char c : t) {t_count[c]++;}// 记录当前窗口内每个字符的出现次数std::unordered_map<char, int> window_count;int required = t_count.size(); // 需要匹配的字符种类数int formed = 0; // 当前窗口内已匹配的字符种类数int left = 0, right = 0; // 滑动窗口的左右指针int min_len = s.size() + 1; // 最小窗口的长度int min_left = 0; // 最小窗口的左指针while (right < s.size()) {// 扩展窗口char c = s[right];window_count[c]++;if (t_count.find(c) != t_count.end() && window_count[c] == t_count[c]) {formed++;}// 收缩窗口while (left <= right && formed == required) {c = s[left];if (right - left + 1 < min_len) {min_len = right - left + 1;min_left = left;}window_count[c]--;if (t_count.find(c) != t_count.end() && window_count[c] < t_count[c]) {formed--;}left++;}right++;}return min_len == s.size() + 1 ? "" : s.substr(min_left, min_len);}
};

官方解题思路

其核心思想也是使用滑动窗口的思想,结合哈希表来找到字符串 s s s 中包含字符串 t t t 所有字符的最小子串。

初始化:

  • 使用 unordered_map ori 来记录目标字符串 t 中每个字符的出现次数。
  • 定义两个指针 lr,分别表示当前窗口的左边界和右边界。
  • 定义变量 len 来记录当前找到的最小子串的长度,ansLansR 分别记录最小子串的起始和结束位置。

遍历字符串:

首先,右指针 r 向右移动,扩展窗口,直到窗口包含目标字符串 t 中的所有字符。每次右指针移动时,更新当前窗口中字符的计数。当窗口包含了 t 中所有字符时,尝试通过移动左指针 l 来收缩窗口,寻找更小的覆盖子串。每次收缩时,更新当前窗口中字符的计数。在每次收缩窗口时,检查当前窗口的大小是否小于之前记录的最小子串长度。如果是,则更新最小子串的起始和结束位置。遍历完成后,返回从 ansLansR 的子串。如果未找到符合条件的子串,则返回空字符串。

class Solution {
public:unordered_map <char, int> ori, cnt;bool check() {for (const auto &p: ori) {if (cnt[p.first] < p.second) {return false;}}return true;}string minWindow(string s, string t) {for (const auto &c: t) {++ori[c];}int l = 0, r = -1;int len = INT_MAX, ansL = -1, ansR = -1;while (r < int(s.size())) {if (ori.find(s[++r]) != ori.end()) {++cnt[s[r]];}while (check() && l <= r) {if (r - l + 1 < len) {len = r - l + 1;ansL = l;}if (ori.find(s[l]) != ori.end()) {--cnt[s[l]];}++l;}}return ansL == -1 ? string() : s.substr(ansL, len);}
};

时间复杂度:

  • 时间复杂度: O ( n ) O(n) O(n) 其中 n 是字符串 s 的长度。
    由于每个字符最多被指针 lr 各访问一次,因此时间复杂度为 O ( n ) O(n) O(n)
  • 空间复杂度: O ( k ) O(k) O(k) 其中 k 是字符集的大小。
    需要额外的空间来存储哈希表 ori,其大小与字符集的大小成正比。

结果

请添加图片描述

算法分析

同样的思路,我的算法要比官方题解效率更高,主要可能有以下两方面的原因:

数据结构的选择:

官方题解: 使用了 unordered_map 来记录字符的出现次数。
我的算法: 使用了更高效的数据结构,即临时变量和数组。
影响: 对于字符集大小固定的情况,使用临时变量数组可以减少哈希计算的开销,从而提高效率。

字符串操作:

官方题解: 每次收缩窗口时,会频繁地进行字符串截取操作。
我的算法:通过记录子串的起始位置和长度,避免了多次字符串截取。
影响: 减少字符串操作可以降低时间复杂度,提升性能。

http://www.jmfq.cn/news/5361967.html

相关文章:

  • 深圳网站建设怎样选/问卷调查网站
  • 重庆奉节网站建设公司/免费的黄冈网站有哪些平台
  • 宁波网站建设多少钱/千部小黄油资源百度云
  • 北京市住房和城乡建设委员会网站/长春seo优化企业网络跃升
  • 办公室工作绩效 网站建设/个人网站制作流程
  • 网站群建设工作/最佳磁力搜索天堂
  • 郑州航空港建设局网站/网址怎么弄
  • 语文建设编辑部官方网站/分销渠道
  • 网站建设调查通知/输入关键词进行搜索
  • 政府网站建设会议纪要/推广公司哪家好
  • 安徽高端网站建设/手机优化什么意思
  • 二手交易网站建设目标/怎么制作网址
  • 加强网站政务服务建设方案/18岁以上站长统计
  • 网站建设方案目录/中国唯一没有疫情的地方
  • 上海羽贝网站建设/外链查询工具
  • 网站建设网页模板下载/商品推广软文800字
  • 安徽省建设工程安全协会网站/百度在全国有哪些代理商
  • 洛阳直播网站建设/网络推广软文怎么写
  • 华盛链条网站建设/谷歌在线浏览器免费入口
  • 柳州正规网站建设加盟/seo网站搜索优化
  • 企业文化网站建设/百度手机助手应用商店
  • 网站建设 好发信息网/头条收录提交入口
  • 网站建设zhuitiankeji/流量点击推广平台
  • 手机版网站建设合同范本/拓客团队怎么联系
  • 门窗东莞网站建设技术支持/成都网站优化seo
  • nginx建设网站教程/网站买卖交易平台
  • 手机建设网站目的/成都网络运营推广
  • 网站建设外包兼职平台/域名查询大全
  • 大同市建设工程招标投标网站/百度广告推广费用
  • 网站建设的宽带指标要求/网站建设有多少公司