题目描述

给定一个放有字符和数字的数组,找到最长的子数组,且包含的字符和数字的个数相同。

返回该子数组,若不存在这样的数组,返回一个空数组。

示例1

        输入:
["A","1","B","C","D","2","3","4","E","5","F","G","6","7","H","I","J","K","L","M"]
输出:
["A","1","B","C","D","2","3","4","E","5","F","G","6","7"]

示例2

        输入:
["A","A"]
输出:
[]

提示

  • array.length <= 100000

题解

回忆之前做过的一道题目:每日算法系列【LeetCode 523】连续的子数组和,是不是有点相似?那道题是要求是否含有总和为 的整数倍的连续子数组。而本题要求的是最长的子数组,满足数字和字母个数相等。

我们可以把字母抽象成 ,数字抽象成 ,那么子数组的总和含义就是数字个数与字母个数的差值。假设子数组 是满足字母个数和数字个数相等的,那么这段子数组总和必然是 。如果我们用前缀和来进行优化的话, ,也就是说 的值是相等的。

所以我们只需要求一遍前缀和,如果 没有在之前出现过,那就保存一下 最开始出现的下标是 。否则的话就看一下当前子数组长度 和历史最优的长度 谁大,然后决定更不更新。

实际实现中 c++ 还是可以采用 unordered_map 来当作哈希表保存下标。

时间复杂度是

代码

c++

        class Solution {public:vector<string> findLongestSubarray(vector<string>& array) {int n = array.size();unordered_map<int, int> mp;mp[0] = -1;int cnt = 0, l = 0, r = 0;for (int i = 0; i < n; ++i) {cnt += isdigit(array[i][0]) ? 1 : -1;if (mp.find(cnt) != mp.end()) {if (r-l < i-mp[cnt]) {l = mp[cnt] + 1;r = i + 1;}} else {mp[cnt] = i;}}return vector<string>(array.begin()+l, array.begin()+r);}
};

python

        class Solution:def findLongestSubarray(self, array: List[str]) -> List[str]:mp = {0: -1}cnt, l, r = 0, 0, 0for i, s in enumerate(array):cnt += 1 if s[:1].isdigit() else -1if cnt in mp:if r-l < i-mp[cnt]:l = mp[cnt] + 1r = i + 1else:mp[cnt] = ireturn array[l:r]

每日算法系列【LeetCode 面试题 17.05】字母与数字相关推荐

  1. 程序员面试金典 - 面试题 17.05. 字母与数字(哈希map+思维转换)

    1. 题目 给定一个放有字符和数字的数组,找到最长的子数组,且包含的字符和数字的个数相同. 返回该子数组,若存在多个最长子数组,返回左端点最小的.若不存在这样的数组,返回一个空数组. 示例 1: 输入 ...

  2. 重复次数最多的 子串_每日算法系列【LeetCode 424】替换后的最长重复字符

    题目描述 给你一个仅由大写英文字母组成的字符串,你可以将任意位置上的字符替换成另外的字符,总共可最多替换 k 次.在执行上述操作后,找到包含重复字母的最长子串的长度. 示例1 输入: s = &quo ...

  3. leetcode 面试题 17.14. 最小K个数 大顶堆 小顶堆 快排

    leetcode 面试题 17.14. 最小K个数 [难度:中等] 设计一个算法,找出数组中最小的k个数.以任意顺序返回这k个数均可. 示例: 输入: arr = [1,3,5,7,2,4,6,8], ...

  4. [leetcode 面试题 17.17] -- 多次搜索,KMP与字典树

    [leetcode 面试题 17.17] -- 多次搜索 题目来源 分析 KMP思路 完整代码 字典树 完整代码 题目来源 https://leetcode-cn.com/problems/multi ...

  5. ⭐算法入门⭐《堆》中等01 —— LeetCode 面试题 17.09. 第 k 个数

    文章目录 一.题目 1.题目描述 2.基础框架 3.原题链接 二.解题报告 1.思路分析 2.时间复杂度 3.代码详解 三.本题小知识 四.加群须知 一.题目 1.题目描述   有些数的素因子只有 3 ...

  6. Leetcode每日一题:面试题17.12 binode

    面试题 17.12. BiNode 二叉树的中序遍历是弱项,需要额外练习,特别是二叉搜索树的中序遍历,利用它是递增数列的性质: 通过一个pre来不断地修改节点指向,有左节点优先左节点,没有则右节点,p ...

  7. 【LeetCode每日一题】——面试题17.21.直方图的水量

    文章目录 一[题目类别] 二[题目难度] 三[题目编号] 四[题目描述] 五[题目示例] 六[解题思路] 七[时间频度] 八[代码实现] 九[提交结果] 一[题目类别] 双指针 二[题目难度] 困难 ...

  8. LeetCode 面试题 17.16. 按摩师

    面试题 17.16. 按摩师 题目:一个有名的按摩师会收到源源不断的预约请求,每个预约都可以选择接或不接.在每次预约服务之间要有休息时间,因此她不能接受相邻的预约.给定一个预约请求序列,替按摩师找到最 ...

  9. 【每日一题】 面试题 17.14. 最小K个数

    面试题 17.14. 最小K个数

  10. 求栈中元素个数算法_每日算法系列【LeetCode 315】计算右侧小于当前元素的个数...

    题目描述 给定一个整数数组 nums ,按要求返回一个新数组 counts .数组 counts 有该性质: counts[i] 的值是 nums[i] 右侧小于 nums[i] 的元素的数量. 示例 ...

最新文章

  1. postgres 显示变量_postgre 查询时 postgres=# 变成 ! ! 要怎么解决?
  2. 2011年3月华章新书书讯:ASP.NET本质论、Erlang编程指南、SNS网站构建
  3. 如何HttpWebRequest模拟登陆,获取服务端返回Cookie以便登录请求后使用
  4. 数据结构(三)之单链表反向查找
  5. 关于多条id相同,只取其中一条记录的sql语句
  6. Kubernetes 1.9集群使用traefik发布服务
  7. pip安装环境报错[Errno 99] Cannot assign requested address问题解决
  8. 微信小程序学习笔记-(9)-仿智行火车票
  9. 鸿蒙os锁屏样式怎么用,怎样设置微信锁屏显示
  10. java实现的端口映射器
  11. 用python求圆的表面积_【用python写一组类(class)对应各种几何体(正方体,长方体,球,圆柱)的表面积和体积的编码】作业帮...
  12. 超鸿蒙 混希夷 寂寥,下列句子与“故凡为愚者.莫我若也 的句式不同的一项是 A.超鸿蒙.混希夷.寂寥而莫我知也 B.而良人未之知也 C.及长.不省所怙.惟兄嫂是依 D.王语暴以好乐...
  13. 脖子黑色素沉淀怎么去除,有效方法
  14. 【思维导图怎么画】万彩脑图大师教程 | 插入动画图标
  15. DeleteObject()
  16. 浏览器免费安装ChatGPT插件与国内免费ChatGPT分享
  17. 论Python中注释的重要性
  18. #18 可视化基础4-簇形柱状图、百分比堆积柱状图、并列子图
  19. 为什么梦里常有视觉和听觉,却没有痛觉和嗅觉?
  20. 非计算机专业想学编程语言进入大数据岗位必读书单推荐

热门文章

  1. XP引导Ubuntu--Ubuntu手记之系统配置
  2. 解决用root用户及密码可以直接登陆某LINUX系统,但是用ssh登陆,系统却总是提示密码不对...
  3. 随手练—— 洛谷-P2945 Sand Castle(贪心)
  4. Beta版本测试第二天
  5. 04-cmake语法-STREQUAL
  6. babel-preset-env使用介绍
  7. [Leetcode] spiral matrix ii 螺旋矩阵
  8. 第四章表单与文件-笔记-验证
  9. 如何养成周回顾习惯的回复
  10. sql server 恢复数据库时提示有其他用户连接,怎么办?