【数据结构-前缀哈希】力扣17.05. 字母与数字

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

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

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

class Solution {
public:
    vector<string> findLongestSubarray(vector<string>& array) {
        //键代表sum, 值代表索引
        unordered_map<int, int> group;
        group[0] = -1;
        int sum = 0;
        int startIndex = 0, maxlength = 0;
        for(int i = 0;i < array.size();i++){
            //题目没说清楚,以字符串第一个字符判断
            if(isalpha(array[i][0])){
                sum++;
            }else{
                sum--;
            }

            if(group.count(sum)){
                int firstIndex = group[sum];
                if(i - firstIndex > maxlength){
                    maxlength = i - firstIndex;
                    startIndex = firstIndex + 1;
                }
            }else{
                group[sum] = i;
            }
        }
        return vector<string>(array.begin() + startIndex,array.begin() + startIndex + maxlength);
    }
};

将字母转换为1,数字转换为-1,然后计算前缀和。维护一个二维数组group,键代表前缀和sum, 值代表索引。当在遍历array的时候如果发现有两个位置的sum是相等的,则他们之间字母等于数字,这时候找到对应的索引位置group[sum],如果这个子段的长度是最大的符合条件的子段,那么就更新maxlength的值,并且令startIndex = firstIndex + 1,代表子段开头的位置。如果没有找到对应的sum,那么就记录对应的sum和索引到哈希表中,继续遍历下一个元素。

最后返回一个容器和迭代器,区间为
[第一个元素,最后一个元素+1)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值