给定一个放有字母和数字的数组,找到最长的子数组,且包含的字母和数字的个数相同。
返回该子数组,若存在多个最长子数组,返回左端点下标值最小的子数组。若不存在这样的数组,返回一个空数组。
示例 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)