package
0.0.0-20230809123828-b071cee2968a
Repository: https://github.com/codehanhan/leetcode-go.git
Documentation: pkg.go.dev

# README

面试题 17.05. 字母与数字

1. 题目描述

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

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

示例 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

标签 数组 哈希表 前缀和

2. 解题

大体思路如下:

  • 由于数组中只存在字母和数字两种情况,因此我们可以将字母记为-1,数字记为1来简化问题;

  • 题目要求子数组中的字符和数字个数相同,因此我们可以考虑通过求解前缀和来解决这个问题,解分为两种情况:

    • 两个前缀和的值相同,例如:prefix[i]==prefix[j],说明[0,i]和[0,j]之间多余数字或字符的个数相同,那么如果我们用区间[0,j]减去区间[0,i]之后,在(i,j]之间的数字和字符个数必然相同,因此[(i,j]可能是一组解(注意此处得区间是左开右闭的);
    • 前缀和为0处,例如:prefix[i]=0,说明 [0,i]之间的数字和字符个数相同,所以[0,j]可能是一组解;

由于题目中需要求得最长的子数组,并且长度相同时以左边最小的子数组作为开头,因此最终答案需要找到前缀和相同的子数组和前缀和为0的子数组最大的那一个即可。