赞
踩
给定一个放有字母和数字的数组,找到最长的子数组,且包含的字母和数字的个数相同。
返回该子数组,若存在多个最长子数组,返回左端点下标值最小的子数组。若不存在这样的数组,返回一个空数组。
示例 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 String[] findLongestSubarray(String[] array) {
int n=array.length;
int[] arr=new int[n+1];
for(int i=0;i<n;i++){
arr[i+1]=arr[i]+(Character.isLetter(array[i].charAt(0))?-1:1);
}
HashMap<Integer,Integer> map=new HashMap<>();
map.put(0,0);
int max=0,left=-1;
for(int i=0;i<=n;i++){
int curSum=arr[i];
if(map.containsKey(curSum)){
if(i-map.get(curSum)>max){
max=i-map.get(curSum);
left=map.get(curSum);
}
}else{
map.put(curSum,i);
}
}
String[] res;
if(left!=-1){
res=new String[max];
int cnt=0;
for(int i=left;i<left+max;i++){
res[cnt++]=array[i];
}
}else{
res=new String[]{};
}
return res;
}
}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。