面试题 17.05. 字母与数字
创始人
2024-06-01 15:08:24
0

题目链接

面试题 17.05. 字母与数字 mid

题目描述

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

返回该子数组,若存在多个最长子数组,返回左端点下标值最小的子数组。若不存在这样的数组,返回一个空数组。

示例 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≤100000array.length \leq 100000array.length≤100000

分析:前缀和 + 哈希表

我们可以将 字母看作是 +1,数字看作是 -1,那么原问题就转换为 求最长的一段和 sum = 0的子数组

我们用一个哈希表 m来记录遍历过的 前缀和 s[i]和它对应的下标 i

如果当前遍历到了 s[j],并且 m存在 s[j]这个键。由此,我们可以得到 i = m[s[j]]。那么 (i , j]这一段就是和为 0

的子数组,我们就将答案更新即可。

我们用 idx代表最长的那段子数组的起始下标,用 len表示最长的那段子数组的长度。

最后返回 array的这一段 [idx , idx + len]即可。

时间复杂度: O(n)O(n)O(n)

C++代码:

class Solution {
public:vector findLongestSubarray(vector& arr) {int n = arr.size();unordered_map m{{0,-1}};int idx = 0 , len  = 0;for(int j = 0 ,s = 0;j < n;j++){s += (arr[j][0] >= 'A' ? 1 : -1);if(m.count(s)){int i = m[s];if(j - i > len){len = j - i;idx = i + 1;}}else m[s] = j;}return vector (arr.begin() + idx,arr.begin() + idx + len);}
};

Python代码:


class Solution:def findLongestSubarray(self, arr: List[str]) -> List[str]:m = {0:-1}s = idx = len = 0for j,str in enumerate(arr):s += 1 if str.isalpha() else -1if s in m:i = m[s]if len < j - i:idx = i + 1len = j - ielse:m[s] = j    return arr[idx:idx+len]

相关内容

热门资讯

深交所参与建设的香港综合基金平... 7月3日,由香港交易及结算所有限公司(以下简称港交所)牵头、深圳证券交易所(以下简称深交所)下属深圳...
【工业硅】盘面涨跌反复,市场情...  在经历了昨日期货行情大幅上行后,今日工业硅期货行情转弱运行,盘面价格稍有松动!7月3日,截止15:...
四预警齐发!我国多地高温 四川... 01高温黄色预警中央气象台7月3日18时继续发布高温黄色预警:预计7月4日白天,华北南部、黄淮、江淮...
吉宏股份(02603)截至6月... 吉宏股份(02603)发布公告,截至2025年6月30日,公司通过回购专用证券账户以集中竞价交易方式...
夏天白手臂的秘密武器是…… 转自:扬子晚报扬子晚报网7月3日讯(记者 薄云峰)这两天,江苏多地持续高温,户外阳光刺眼,紫外线特别...
甘肃天水一幼儿园部分幼儿血铅异... 记者3日从甘肃省天水市获悉,1日,天水市麦积区市场监督管理局等部门接群众反映后,查获一起某幼儿园违规...
安诺其(300067.SZ):... 格隆汇7月3日丨安诺其(300067.SZ)公布,控股股东、实际控制人纪立军先生的一致行动人张烈寅女...
长虹美菱拟斥1.5亿至3亿元回... 2025年7月4日,长虹美菱发布回购股份报告书,公司将使用自有资金和自筹资金,通过集中竞价交易方式回...
东方卫视直击:日本参议院选举拉... 日本国会参议院选举7月3日发布公告,为期17天的竞选活动就此拉开序幕。这是石破内阁成立以来的首次参议...