九章算法基础班

Remove Substrings

Given a string s and a set of n substrings. You are supposed to remove every instance of those n substrings from s so that s is of the minimum length and output this minimum length.

Have you met this question in a real interview? Yes
Example
Given s = ccdaabcdbb, substrs = ["ab", "cd"]
Return 2

Explanation:
ccdaabcdbb -> ccdacdbb -> cabb -> cb (length = 2)

题目

思路:很容易想到贪心,能尽量削减原串就削减原串,但是贪心是错误的,反例:"abcabd", ["ab","abcd"]

   用DFS,对于dict中的每一个子串,在原串中找到匹配的该串的索引,并截取原字符串,更新结果,将截取后的字符串加入到队列中(增加一个set来避免相同的串重复加入到队列)以便下一次循环,然后从该索引后面的一个位置开始再找与该子串匹配的索引,重复上述过程。

 1 public class Solution {
 2     /**
 3      * @param s a string
 4      * @param dict a set of n substrings
 5      * @return the minimum length
 6      */
 7     public int minLength(String s, Set<String> dict) {
 8         // Write your code here
 9         if (s == null) {
10             return 0;
11         }
12         if (s.length() == 0 || dict == null || dict.size() == 0) {
13             return s.length();
14         }
15         int result = s.length();
16         Queue<String> queue = new LinkedList<>();
17         Set<String> set = new HashSet<>();
18         queue.offer(s);
19         set.add(s);
20         while (!queue.isEmpty()) {
21             String str = queue.poll();
22             for (String subStr : dict) {
23                 int index = str.indexOf(subStr);
24                 while (index != -1) {
25                     String newStr = str.substring(0, index)
26                         + str.substring(index + subStr.length(), str.length());
27                     if (!set.contains(newStr)) {
28                         set.add(newStr);
29                         queue.offer(newStr);
30                         result = Math.min(result, newStr.length());
31                     }
32                     index = str.indexOf(subStr, index + 1);
33                 }
34             }
35         }
36         return result;
37     }
38 }

时间: 2025-01-11 21:58:23

九章算法基础班的相关文章

九章算法 基础算法 强化算法 系统设计 大数据 安卓 leetcode 高清视频

leetcode 直播视频讲座录像 九章算法视频录像,PPT 算法班,算法强化班,Java入门与基础算法班,big data项目实战班,Andriod项目实战班 九章算法下载 九章算法面试 九章算法leetcode 九章算法答案 九章算法mitbbs 九章算法班 九章算法ppt 九章算法录像 九章算法培训 九章算法微博 leetcode 视频 九章算法偷录 算法培训 算法班课程大纲: 1 从strStr谈面试技巧与Coding Style(免费试听) 2 二分搜索与旋转排序数组 Binary S

九章算法 课程 视频 录制 免费下载 cs3k.com

cs3k.com [ 九章算法强化班 ] 课程 完整 视频 录制 免费下载 最新一期 << 九章算法强化班 >> 课程完整视频录制, 课件打包下载, 百度云盘 地址 ! 本站长期提供九章算法免费课程视频 与 课件打包下载 Big Table 教学TodoList 探讨System Design 分析Rate Limiter 视频Binary Tree 研究Dribbble 设计Big Data 研究PageRank 面试Google Suggestion 设计Location Ba

CS3K.com 九章算法 课程 视频 录制 免费下载

[ 九章算法班 ] 课程 完整 视频 录制 免费下载最新一期 << 九章算法班 >> 课程完整视频录制, 课件打包下载, 百度云盘 地址 ! 本站长期提供九章算法免费课程视频 与 课件打包下载 Dribbble 视频System Design 探讨Distributed File System 研究MiniLinkedin 探讨Map Reduce 分析Array 视频Design Tiny Url 教学Android 设计Divide Conquer 研究PageRank 视频

九章算法

九章算法 前言 第一天的算法都还没有缓过来,直接就进入了第二天的算法学习.前一天一直在整理Binary Search的笔记,也没有提前预习一下,好在Binary Tree算是自己最熟的地方了吧(LeetCode上面Binary Tree的题刷了4遍,目前95%以上能够Bug Free)所以还能跟得上,今天听了一下,觉得学习到最多的,就是把Traverse和Divide Conquer分开来讨论,觉得开启了一片新的天地!今天写这个博客我就尽量把两种方式都写一写吧. Outline: 二叉树的遍历

【九章算法免费公开课】从 strStr 谈面试技巧与 Coding Style

刷题到底刷到什么程度才够? 题目不会直接说不会么? 为什么题目都做出来还是老是挂? 觉得面试官总在为难你? 从来就搞不懂动态规划是什么? 如何正确的骑驴找马? 什么是正确的Coding Style? 面试中该与面试官如何沟通? 本周日,九章算法<算法班>金牌讲师-段誉 为您倾情奉献,同时提供实时在线问答环节,解答您最想知道的面试"内幕"! 讲座时间: 北京时间6月14日 09:30-11:30 (周日) 美西时间6月13日 18:30-20:30(周六) 报名链接: htt

第二章 算法基础 思考题2-1

package chap02; import static org.junit.Assert.*; import java.util.Arrays; import java.util.Random; import org.junit.Test; /*** * 在归并排序中对小数组采用插入排序 * * @author xiaojintao * */ public class ques2_1 { /** * 归并排序算法 * * @param a * @return */ static void m

第二章 算法基础 思考题2-4(逆序对)

1 package chap02; 2 3 import static org.junit.Assert.*; 4 5 import java.util.Arrays; 6 7 import org.junit.Test; 8 9 public class ques2_4 { 10 /** 11 * 逆序对,将一个序列中的所有逆序对打印输出 12 * 13 * @author xiaojintao 14 * 15 */ 16 static void printReverseOrder(int[]

分治习题--九章算法培训课第三章笔记

1.Maximum Depth of Binary Tree 这是道简单的分治习题了 分: 左子树最大深度 右子树最大深度 治: 最大深度等于max(左子树,右子树)+1 public class Solution { public int maxDepth(TreeNode root) { if (root == null) { return 0; } int left = maxDepth(root.left); int right = maxDepth(root.right); retur

九章算法--分配抄书员

思路: (1)最常见的思路就是dp:状态表示为dp[i][j],表示前j个人抄i本书最少时间:dp[i][j] = min(max(dp[k][j-1],sum(k+1,i))) (j<=k<i): 解释一下min,max操作,由于抄书是并行,所以就是取所有人时间里的最大值 (2)二分+贪心:我自己一开始的思路是总和除以人数,然后贪心,但是这样可能不是最优解.但是我们可以计算每个人最大和最小抄书的时间,然后二分搜索这个时间即可. 下面代码是DP:但是没有考虑边界情况只是写来熟悉算法流程. 1