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

被折叠的 条评论
为什么被折叠?



