【限时免费】20天拿下华为OD笔试之【不定滑窗】2023Q1A-完美走位【欧弟算法】全网注释最详细分类最全的华为OD真题题解

news/2024/7/20 17:38:42 标签: 华为od, 算法

【不定滑窗】2023Q1A-完美走位

题目描述与示例

题目

在第一人称射击游戏中,玩家通过键盘的 ASDW 四个按键控制游戏人物分别向左、向后、向右、向前进行移动,从而完成走位。

假设玩家每按动一次键盘,游戏人物会向某个方向移动一步,如果玩家在操作一定次数的键盘并且各个方向的步数相同时,此时游戏人物必定会回到原点,则称此次走位为完美走位

现给定玩家的走位(例如:ASDA),请通过更换其中一段连续走位的方式使得原走位能够变成一个完美走位。 其中待更换的连续走位可以是相同长度的任何走位。

请返回待更换的连续走位的最小可能长度。若果原走位本身是一个完美走位,则返回 0

输入

输入为由键盘字母表示的走位s,例如:ASDA

输出

输出为待更换的连续走位的最小可能长度

备注

  1. 走位长度 1 ≤ s.length ≤ 10^5
  2. s.length4 的倍数
  3. s 中只含有 A, S, D, W 四种字符

示例一

输入

ASDW

输出

0

说明

已经是完美走位了。

示例二

输入

AASW

输出

1

说明

需要把一个 A 更换成 D,这样可以得到 ADSW 或者 DASW

示例三

输入

AAAA

输出

3

说明

可以替换后 3A,得到 ASDW

示例四

输入

AAAAADDD

输出

4

解题思路

注意,本题和LC76. 最小覆盖子串几乎完全一致。重点在于如何将原问题转化为覆盖子串的问题。

题目有两个重要条件:

  1. 完美走位字符串是指字符串中ASDW四种字符出现次数相等的字符串
  2. s.length4 的倍数

对于长度为len(s)的原字符串s来说,为了使其转变为一个完美走位字符串,其中ASDW四种字符出现次数应该均为 num = len(s) // 4

原字符串s中各个字符出现的次数可以用哈希表cnt_s = Counter(s)进行统计,对于出现次数多于num = len(s) // 4的字符ch,应该修改 cnt_s[ch] - len(s) // 4 个字符为其他出现次数少于num = len(s) // 4的字符,才能够使得s变为一个完美走位字符串。

以示例四为例,s = "AAAAADDD",字符"A"出现的次数为5,字符"D"应该修改3,而num = len(s) // 4 = 2,需要修改3"A"1"D"为剩余两种字符,才能使得s变为完美走位字符串。故我们需要找到包含3"A"1"D"的最小子串。

因此这个问题就转变为了,找到覆盖cnt_s[ch] - len(s) // 4个的字符chch满足条件cnt_s[ch] > len(s) // 4)的最短子串。需要覆盖的子串中所出现的字符以及次数,可以用另一个哈希表cnt_sub储存。

那么这个问题就和LC76. 最小覆盖子串完全一致了,直接滑窗三问三答解决即可。上述逻辑整理为代码即

num = len(s) // 4
cnt_s = Counter(s)
cnt_sub = {k: v-num for k, v in cnt_s.items() if v > num}

代码

# 题目:2023Q1A-完美走位
# 分值:200
# 作者:许老师-闭着眼睛学数理化
# 算法:不定滑窗
# 代码看不懂的地方,请直接在群上提问


from collections import Counter
from math import inf


# 定义辅助函数check()
# 用于检查cnt_sub中的各个字符是否出现在cnt_win中,
# 且cnt_win中的个数大于等于cnt_sub
def check(cnt_win, cnt_sub):
    return all(cnt_win[k] >= cnt_sub[k] for k in cnt_sub)


s = input()
num = len(s) // 4
# 获得原字符串中所有字符的出现次数
cnt_s = Counter(s)
# 获得需要覆盖的子串的字符以及出现次数
cnt_sub = {k: v-num for k, v in cnt_s.items() if v > num}

# 如果cnt_sub长度为0,说明每一种字符出现次数相等
# s已经是一个完美走位字符串,输出0
if len(cnt_sub) == 0:
    print(0)
# 否则要进行类似LC76. 最小覆盖子串的不定滑窗过程
else:
    # 初始化滑窗对应的哈希表、最小覆盖的窗口长度
    cnt_win = Counter()
    ans = inf
    left = 0

    for right, ch in enumerate(s):
        # Q1:对于每一个右指针right所指的元素ch,做什么操作?
        # A1:将其加入哈希表cnt_win的计数中
        cnt_win[ch] += 1
        # Q2:什么时候要令左指针left右移?在什么条件下left停止右移?【循环不变量】
        # A2:check(cnt_win, cnt_sub)为True,left可以右移以缩小窗口长度
        while check(cnt_win, cnt_sub):
            # Q3:什么时候进行ans的更新?
            # A3:check(cnt_win, cnt_sub)为True
            ans = min(ans, right-left+1)
            cnt_win[s[left]] -= 1
            left += 1

    print(ans)

时空复杂度

时间复杂度:O(N)。仅需一次遍历整个字符串s

空间复杂度:O(1)。只有4种字符,哈希表所占用空间为常数级别空间。


华为OD算法/大厂面试高频题算法练习冲刺训练

  • 华为OD算法/大厂面试高频题算法冲刺训练目前开始常态化报名!目前已服务100+同学成功上岸!

  • 课程讲师为全网50w+粉丝编程博主@吴师兄学算法 以及小红书头部编程博主@闭着眼睛学数理化

  • 每期人数维持在20人内,保证能够最大限度地满足到每一个同学的需求,达到和1v1同样的学习效果!

  • 60+天陪伴式学习,40+直播课时,300+动画图解视频,300+LeetCode经典题,200+华为OD真题/大厂真题,还有简历修改、模拟面试、专属HR对接将为你解锁

  • 可上全网独家的欧弟OJ系统练习华子OD、大厂真题

  • 可查看链接 大厂真题汇总 & OD真题汇总(持续更新)

  • 绿色聊天软件戳 od1336了解更多


http://www.niftyadmin.cn/n/5114001.html

相关文章

【已解决】Vue项目中Vite以及Webpack代码混淆处理

🐱 个人主页:不叫猫先生,公众号:前端舵手 🙋‍♂️ 作者简介:前端领域优质作者、阿里云专家博主,共同学习共同进步,一起加油呀! 📢 资料领取:前端…

如何查看SSL证书是OV还是DV?

网站的安全性与信任度对于用户来说至关重要,它决定着用户是否继续浏览以及是否与您开展业务。SSL证书则是确保网站能够通过HTTPS加密安全传输数据的基础,可确保网站的安全可信。部署了SSL证书的网站打开后,在浏览器地址栏处会有安全锁标志。而…

FlatBuffers 转换数据字节为JSON字符串的格式。

flatbuffers::Parser::Parse 函数 parser->opts.strict_json true; 置为JSON格式。 头文件: #pragma once#include "prerequisites.h" #include "msg_define_generated.h" #include "LoggerManager.h"class MessageDefine fi…

算法|每日一题|老人的数目|字符串

2678.老人的数目 原题地址: 力扣每日一题:老人的数目 给你一个下标从 0 开始的字符串 details 。details 中每个元素都是一位乘客的信息,信息用长度为 15 的字符串表示,表示方式如下: 前十个字符是乘客的手机号码。 接…

Qt扫盲- QTextStream 理论总结

QTextStream 理论总结 一、概述二、使用1. 构造函数2. 立即写入3. 编码4. 读取 三、格式化 一、概述 QTextStream类为读写文本提供了一个方便的接口。QTextStream可以操作QIODevice、QByteArray或QString。使用QTextStream的流操作符,我们可以方便地读写单词、行和…

halcon 22.11下载安装

下载 链接:https://pan.baidu.com/s/1QrakRRX8-7b3LcZmzBaEDw?pwdjfzq 提取码:jfzq --来自百度网盘超级会员V3的分享 license更新 Halcon License - 2023.10.1(持续更新)_智信仁勇严道的博客-CSDN博客 安装教程 【软件安装】…

Ethernet Protocol

以太网协议说明 1 以太网子层架构 1)MAC and MAC CONTROL Sublayer MAC 负责以太网数据格式中所述的以太网成帧协议以及这些帧的错误检测。MAC 独立于并可以连接到任何类型的物理层设备。这提供了 MAC 子层的实时流控制操作。 MAC CONTROL 和 MAC 子层均由内核在所有操作模式…

英语——分享篇——每日200词——3001-3200

3001——ascertain——[ˌsəteɪn]——vt.查明,弄清——ascertain——a苹果(编码)s美女(编码)certain确定(熟词)——吃苹果的美女确定已查明此事——It can be difficult to ascertain the facts. ——可能难以查明事实真相。 3002——disrupt——[dɪsrʌpt]——…