624.移除子串

描述

给出一个字符串 s 以及 n 个子串。你可以从字符串 s 中移除 n 个子串中的任意一个,使得剩下来 s 的长度最小,输出这个最小长度。

样例

给出 s = ccdaabcdbb,子串为 ["ab","cd"]
返回 2.

解释

ccdaabcdbb -> ccdacdbb -> cabb -> cb (长度为 2)

知识点

思路

解法是 BFS,扩展出能够通过删子串得到的所有字符串,然后选出最短的
删除子串的方式并不是想的那种连续删除一个子串多次,而是这次通过查找子串1出现的不同位置删除子串 1得到多个新的字符串,将所有得到的新的字符串加入队列,进入下一轮删除,后续删除的子串可能和之前删除的子串 1是同一子串,仔细看样例,有时候连续删除并不可行
每一层 bfs 在抛出字符串的不同位置移除字典中的某一子串一次,需要强调,只移除某一子串,且只操作一次

代码

public class Solution {
    /**
     * @param s a string
     * @param dict a set of n substrings
     * @return the minimum length
     */
    public int minLength(String s, Set<String> dict) {
        Queue<String> queue = new LinkedList<String>();
        Set<String> hash = new HashSet<String>();
    
        int min = s.length();
        queue.offer(s);
        hash.add(s);

        while (!queue.isEmpty()) {
            String string = queue.poll();
            for (String sub : dict) {
                /* 字符串的 IndexOf() 方法
                 * 搜索在该字符串上是否出现了作为参数传递的字符串,
                 * 如果找到字符串,则返回字符的起始位置 
                 * (0表示第一个字符,1表示第二个字符依此类推)
                 * 如果说没有找到则返回 -1 
                 */
                int found = string.indexOf(sub);
                while (found != -1) {
                    // 即使字符串中有多个 sub 每次也只截掉一个
                    // new_s 为截掉 sub 后新的字符串
                    String new_s = string.substring(0, found) +
                        string.substring(found + sub.length(), string.length());
                    /* 当找到一个子串的时候,可能 string 中有多个这样的子串, 
                     * 并不是只在子串出现的第一个位置删除,
                     * 而是在所有可以删除这个子串的位置都删除一遍,
                     * 字符串 string 在不同位置删除子串会得到得到不同的的字符串
                     * 此处不是连续删除一个子串多次,
                     * 而是在不同位置删除一次得到多个子串
                     * 通过 while 循环在不同位置删除子串
                     * 通过 for 循环进行多次删除每个子串
                     * 在最终得到的所有字符串中选最短的
                     */
                    // 检查得到的字符串之前有没有出现过
                    if (!hash.contains(new_s)) {
                        // 这句要写在hash表判断之后
                        if (new_s.length() < min) {
                            min = new_s.length();
                        }
                        queue.offer(new_s);
                        hash.add(new_s);
                    }
                    /* 从 found + 1 开始搜索子串下一个出现的位置,如果找不到返回-1
                     * 尝试在 string 的不同位置删除同一子串,得到多种不同的结果,
                     * 加入队列然后抛出,对 dict 中子串(可以和上一次删除的子串
                     * 相同)进行下一次删除
                     */
                    found = string.indexOf(sub, found + 1);
                }
            }
        }
        return min;
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,033评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,725评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,473评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,846评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,848评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,691评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,053评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,700评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,856评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,676评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,787评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,430评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,034评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,990评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,218评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,174评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,526评论 2 343

推荐阅读更多精彩内容