[程序员代码面试指南]字符串问题-找到包含串b所有字符的最小子串

题意

给串A和串B,找到A包含B所有出现字符(相同字符出现几次就要包含几次)的最小子串,输出子串长度

题解

维护一个窗口作为当前考察子串,使用一个hashmap记录每个字符在当前子串已出现情况。时间复杂度O(n).

代码

import java.util.HashMap;

public class Main {
    public static void main(String args[]) {
        //test
        Node root=new Node(1);
        Node n1=new Node(-1);
        Node n2=new Node(2);
        Node n3=new Node(-3);
        root.left=n1;
        root.right=n2;
        n2.left=n3;
        int targetVal=0;

        HashMap<Integer,Integer> sumMap=new HashMap<>();
        sumMap.put(0, 0);
        int maxLen=preOrder(root,targetVal,1,0,0,sumMap);
        System.out.println(maxLen);
    }

    public static int preOrder(Node root,int targetVal,int level,int preSum,int maxLen,HashMap<Integer,Integer> sumMap) {
        if(root==null) {
            return maxLen;
        }
        int curSum=preSum+root.val;//累加和
        if(!sumMap.containsKey(curSum)) {//更新HashMap
            sumMap.put(curSum, level);
        }
        if(sumMap.containsKey(curSum-targetVal)) {//更新MaxLen
            maxLen=Math.max(maxLen, level-sumMap.get(curSum-targetVal));
        }
        maxLen=preOrder(root.left,targetVal,level+1,curSum,maxLen,sumMap);
        maxLen=preOrder(root.right,targetVal,level+1,curSum,maxLen,sumMap);
        if(sumMap.get(curSum)==level) {
            sumMap.remove(curSum);
        }
        return maxLen;
    }
}

原文地址:https://www.cnblogs.com/coding-gaga/p/11020515.html

时间: 2024-08-25 18:15:45

[程序员代码面试指南]字符串问题-找到包含串b所有字符的最小子串的相关文章

[程序员代码面试指南]字符串问题-回文最少分割数(DP)

问题描述 给定一个字符串,输出把它全部切成回文子串的最小分割数. 例:str="ACDCDCDAD",输出2. 解题思路 DP 存储结构 dp数组dp[len+1],dp[i]表示子串str[I:len]至少需要切割几次,才能都切割成回文串.对应的,循环从右至左进行. 注意 dp[i]的含义完全可以做对称更改,循环也变为从前向后即可. 此外,为了保证int cutTime=dp[j+1]+1;//句的顺利执行,且dp[len-1]=0,palStr=true.dp数组多开一位,并初始化

[程序员代码面试指南]二叉树问题-找到二叉树中两节点最近公共祖先

题解 法一:后序遍历.搞清返回值逻辑. todo 更新别的方法 法一代码 public class Parent { public static void main(String args[]) { Node n1=new Node(1); Node n2=new Node(2); Node n3=new Node(3); Node n4=new Node(4); n1.left=n2; n1.right=n3; n3.left=n4; System.out.print(firstParent(

左神算法书籍《程序员代码面试指南》——3_08找到二叉树中符合搜索二又树条件的最大拓扑结构【***】

[题目]给定一棵二叉树的头节点head,已知所有节点的值都不一样,返回其中最大的且符合搜索二叉树条件的最大拓扑结构的大小. [题解] 方法一:二叉树的节点数为N,时间复杂度为O(N2)的方法. 首先来看这样一个问题,以节点h为头的树中,在拓扑结构中也必须以h为头的情况下,怎么找到符合搜索二叉树条件的最大结构?这个问题有一种比较容易理解的解法,我们先考查h的孩子节点,根据孩子节点的值从h开始按照二叉搜索的方式移动,如果最后能移动到同一个孩子节点上,说明这个孩子节点可以作为这个拓扑的一部分,并继续考

程序员代码面试指南 IT名企算法与数据结构题目最优解 ,左程云著pdf高清版免费下载

下载地址:网盘下载 备用地址:网盘下载 内容简介  · · · · · ·这是一本程序员面试宝典!书中对IT名企代码面试各类题目的最优解进行了总结,并提供了相关代码实现.针对当前程序员面试缺乏权威题目汇总这一痛点,本书选取将近200道真实出现过的经典代码面试题,帮助广大程序员的面试准备做到万无一失.“刷”完本书后,你就是“题王”!__eol__本书采用题目+解答的方式组织内容,并把面试题类型相近或者解法相近的题目尽量放在一起,读者在学习本书时很容易看出面试题解法之间的联系,使知识的学习避免碎片化

[程序员代码面试指南]递归和动态规划-最长公共子串问题

题目描述 给定两个串,输出最长公共子串. 解题思路 维护dp[i][j],表示子串str1[0:i+1]与str2[0:j+1]的最长公共子串长度. 由dp[][]右下角开始,找公共子串. 代码 public class Solution{ private int[][] getDp(char[] str1,char[] str2){ int[][] dp=new int[str1.length][str2.length]; int temp=0; for(int i=0;i<str1.leng

[程序员代码面试指南]数组和矩阵问题-找到无序数组中最小的k个数(堆排序)

题目链接 https://www.nowcoder.com/practice/6a296eb82cf844ca8539b57c23e6e9bf?tpId=13&tqId=11182&tPage=2&rp=2&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking 题目描述 从无序序列,找到最小topk个元素. 解题思路 使用大根堆维护最小topk个元素: - 首先前k个元素建立大根堆(从

[程序员代码面试指南]链表问题-向有序的环形链表插入新节点

题意 给定非递减循环链表的头节点,和一个待插入的值,将其插入循环链表. 题解 遍历一遍,找到插入位置则返回:若没找到,说明插到头节点尾节点间,注意区分插入的是最大值还是最小值,返回的头节点不一样. 代码 public class Main { public static void main(String args[]) { //test Node n1=new Node(1); Node n2=new Node(1); Node n3=new Node(3); n1.next=n2; n2.ne

[程序员代码面试指南]链表问题-按照左右半区的方式重新组合单链表

题意 把链表分成左右半区,奇数个节点则右半区长一点,重新交叉排列成链表,如下例: 1,2,3,4,5,# =>1,3,2,4,5,# 1,2,3,4,#=>1,3,2,4,# 题解 找到分割点,拆开再合并. 代码 public class Main { public static void main(String args[]) { //test Node n1=new Node(1); Node n2=new Node(2); Node n3=new Node(3); Node n4=new

《程序员代码面试指南》第八章 数组和矩阵问题 将正方形矩阵顺时针转动90

题目 将正方形矩阵顺时针转动90 java代码 package com.lizhouwei.chapter8; /** * @Description: 将正方形矩阵顺时针转动90 * @Author: lizhouwei * @CreateDate: 2018/4/28 22:16 * @Modify by: * @ModifyDate: */ public class Chapter8_2 { public void rotate(int[][] matrix) { int tR = 0; i