程序员面试金典 17.5

本文介绍了一种高效算法,用于解决给定包含字母和数字的数组中,寻找包含相同个数的字母和数字的最长子数组的问题。通过计算每个位置上字母和数字的数量差,并利用哈希表记录首次出现的差值位置,可以避免O(n^3)的暴力枚举,实现O(n)的时间复杂度。

Letters and Numbers:给定一个包含字母和数字的数组,求包含相同个数字母和数字的最长子数组。

从数据量来看,O(n ^ 3)的算法肯定是超时了,所以肯定不能用暴力枚举的方法。我们可以算出在每个位置上字母和数字数量的差值,如果后面出现了同样的差值,则表示这两次差值之间的子数组满足题设条件。在从左到右的遍历过程中,保存差值第一次出现的位置,即可得到最长的子数组。根据差值的含义,设第一次差值为0的位置为-1

class Solution {
public:
    vector<string> findLongestSubarray(vector<string>& arr) {
        unordered_map<int, int> FirstIndex;
        FirstIndex[0] = -1;
        int delta = 0, begin = 0, end = 0;
        for(size_t i = 0; i < arr.size(); i++)
        {
            if(isalpha(arr[i].front())) delta++;
            else delta--;
            auto iter = FirstIndex.find(delta);
            if(iter == FirstIndex.end()){
                FirstIndex[delta] = i;
            }
            else{
                if(end - begin < i - iter->second){
                    end = i + 1;
                    begin = iter->second + 1;
                }
            }
        }
        return vector<string>(arr.begin() + begin, arr.begin() + end);
    }
};
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值