【每日一题Day143】面试题 17.05. 字母与数字 | 前缀和+哈希表

简介: 【每日一题Day143】面试题 17.05. 字母与数字 | 前缀和+哈希表

面试题 17.05. 字母与数字

给定一个放有字母和数字的数组,找到最长的子数组,且包含的字母和数字的个数相同。

返回该子数组,若存在多个最长子数组,返回左端点下标值最小的子数组。若不存在这样的数组,返回一个空数组。

和昨天的很像呀,但是我在数组拷贝的时候 写成了res[i]=array[i],然后一直越界,找了半天bug,真的有被自己蠢到。。。。

  • 思路:
  • 字符串数组转化为前缀和数组,为字母的记为1分,为数字的记为-1分,那么当连续子数组的总分为0时,该子数组包含的字母和数字的个数相同。
  • 实现
  • 统计前缀和数组,对于每一个右边界,此时的前缀和记为sum,寻找合法的左边界,当左边界的前缀和也为sum时,子数组array[left,right]中字母和数字的个数相同,记录最长合法子数组的左右边界
class Solution {
    public String[] findLongestSubarray(String[] array) {
        int n = array.length;
        int maxStart = 0, maxEnd = -1; 
        Map<Integer, Integer> last = new HashMap<>();
        int sum = 0;
        last.put(0, 0);
        for (int i = 0; i < n; i++){
            if (Character.isLetter(array[i].charAt(0))){
                sum += 1;
            }else{
                sum -= 1; 
            }        
            if (last.containsKey(sum)){
                int j = last.get(sum);
                if (i + 1 - j > maxEnd - maxStart){
                    maxEnd = i + 1;
                    maxStart = j;
                }                
            }else{
                last.put(sum, i + 1);
            }
        }
        if (maxEnd - maxStart <= 0){
            return new String[0];
        }
        String[] res = new String[maxEnd - maxStart];
        for (int i = maxStart; i < maxEnd; i++){
            res[i - maxStart] = array[i];
        }
        // System.arraycopy(array, maxStart, res, 0, maxEnd - maxStart);
        // return Arrays.copyOfRange(array, maxStart, maxEnd);
        return res;
    }
}

复杂度

时间复杂度:O ( n )

空间复杂度:O ( n )

目录
相关文章
|
6月前
力扣面试经典题之哈希表
力扣面试经典题之哈希表
39 0
|
6月前
|
存储 算法 程序员
【Leetcode 程序员面试金典 01.01】判定字符是否唯一 —— 位运算|哈希表
可以使用哈希表或位运算来解决此问题:由题可知s[i]仅包含小写字母,int[26]即能表示字符的出现次数;
|
4月前
|
存储 索引
面试题 17.05. 字母与数字(前缀和)
面试题 17.05. 字母与数字(前缀和)
|
5月前
|
存储 算法 Java
面试高频算法题汇总「图文解析 + 教学视频 + 范例代码」之 二分 + 哈希表 + 堆 + 优先队列 合集
面试高频算法题汇总「图文解析 + 教学视频 + 范例代码」之 二分 + 哈希表 + 堆 + 优先队列 合集
|
5月前
|
存储 算法 大数据
深入解析力扣170题:两数之和 III - 数据结构设计(哈希表与双指针法详解及模拟面试问答)
深入解析力扣170题:两数之和 III - 数据结构设计(哈希表与双指针法详解及模拟面试问答)
|
6月前
|
存储 算法 Java
数据结构与算法面试题:实现一个哈希表,并考虑哈希冲突的解决方案。
数据结构与算法面试题:实现一个哈希表,并考虑哈希冲突的解决方案。
50 0
|
算法 C++ Python
每日算法系列【LeetCode 面试题 17.05】字母与数字
每日算法系列【LeetCode 面试题 17.05】字母与数字
|
编译器 API C语言
力扣面试题17.04 - 消失的数字【求和相减 + 异或位运算 + 哈希表】
三种方法巧解力扣面试题17.04 - 消失的数字,你值得拥有
148 0
力扣面试题17.04 - 消失的数字【求和相减 + 异或位运算 + 哈希表】
|
算法 索引
【Day15】算法刷题(解题思路+详细注释)[面试题 17.09. 第 k 个数 ][424. 替换后的最长重复字符 ][438. 找到字符串中所有字母异位词 ]
了解[面试题 17.09. 第 k 个数 ][424. 替换后的最长重复字符 ][438. 找到字符串中所有字母异位词 ]。
172 0
【Day15】算法刷题(解题思路+详细注释)[面试题 17.09. 第 k 个数 ][424. 替换后的最长重复字符 ][438. 找到字符串中所有字母异位词 ]