字母与数字
题目描述
给定一个放有字母和数字的数组,找到最长的子数组,且包含的字母和数字的个数相同。
返回该子数组,若存在多个最长子数组,返回左端点下标值最小的子数组。若不存在这样的数组,返回一个空数组
样例
样例输入
[“A”,“1”,“B”,“C”,“D”,“2”,“3”,“4”,“E”,“5”,“F”,“G”,“6”,“7”,“H”,“I”,“J”,“K”,“L”,“M”]
[“A”,“A”]
样例输出
[“A”,“1”,“B”,“C”,“D”,“2”,“3”,“4”,“E”,“5”,“F”,“G”,“6”,“7”]
[]
提示
- array.length <= 100000
思路
可以使用前缀和,这类区间,有较为明显的特征。
代码实现
class Solution {
public String[] findLongestSubarray(String[] array) {
int sum = 0, s = 0;
HashMap<Integer, Integer> map = new HashMap<>();
map.put(0, 0);
int first = 0, second = 0;
for(int i = 0; i < array.length; i++){
sum += isLetter(array[i].charAt(0)) ? 1 : -1;
if(map.containsKey(sum)){
if(i - map.get(sum) > s){
s = i - map.get(sum);
first = map.get(sum);
second = i + 1;
}
}else{
map.put(sum, i + 1);
}
}
return Arrays.copyOfRange(array, first, second);
}
private boolean isLetter(char c){
if('a' <= c && c <= 'z' || ('A' <= c && c <= 'Z')) return true;
return false;
}
}