美文网首页
包含子串的个数

包含子串的个数

作者: 抬头挺胸才算活着 | 来源:发表于2021-10-23 22:20 被阅读0次

public long chooseMessage(String messages, String keys)求messages中包含keys所有字母的子串(不要求顺序)个数,其中两者都是大写字母组成。

例子:
messages = “ABBCDCDAB”,keys = “BAC”,那么所有符合的字符串为
由ABBC开头及后面的字符串共6个
ABBC
ABBCD
ABBCDC
ABBCDCD
ABBCDCDA
ABBCDCDAB

BBCDCDA:2
BCDCDA:2
CDCDAB:1
DCDAB:1
CDAB:1

思路:
我们只需要找到符合条件的最短字符串即可ABBCBBCDCDABCDCDABCDCDACDCDABDCDABCDAB,然后加上自身及后面有的字符串个数(具体实现见下面的count += messages.length() - end + 1;),这种解法类似于连续子区间和

    public long chooseMessage(String messages, String keys) {
        HashSet<Character> set = new HashSet<>();
        for (int i = 0; i < keys.length(); i++) {
            set.add(keys.charAt(i));
        }

        int numOfDigitsMatched = 0;
        HashMap<Character, Integer> tempMap = new HashMap<>();
        int start = 0;
        int end = 0;
        int count = 0;
        while (end < messages.length()) {
            end += 1;
            char lastChar = messages.charAt(end - 1);

            if (set.contains(lastChar)) {
                tempMap.put(lastChar, tempMap.getOrDefault(lastChar, 0) + 1);

                if (tempMap.get(lastChar) == 1) {
                    numOfDigitsMatched += 1;
                }
                while (numOfDigitsMatched == set.size()) {
                    count += messages.length() - end + 1;

                    char firstChar = messages.charAt(start);
                    if (set.contains(firstChar)) {
                        tempMap.put(firstChar, tempMap.get(firstChar) - 1);
                        if (tempMap.get(firstChar) == 0) {
                            tempMap.remove(firstChar);
                            numOfDigitsMatched -= 1;
                        }
                    }
                    start += 1;
                }
            }
        }
        return count;
    }

    public static void main(String[] args) {
        System.out.println(new ChooseMessage().chooseMessage("ABBCDCDAB", "BAC") == 13);
        System.out.println(new ChooseMessage().chooseMessage("ZZ", "Z") == 3);
        System.out.println(new ChooseMessage().chooseMessage("DFWAW", "GF") == 0);
        System.out.println(new ChooseMessage().chooseMessage("", "A") == 0);
        System.out.println(new ChooseMessage().chooseMessage("A", "A") == 1);
    }

相关文章

  • 包含子串的个数

    public long chooseMessage(String messages, String keys)求m...

  • 回文子串个数

    给定一个字符串,你的任务是计算这个字符串中有多少个回文子串。具有不同开始位置或结束位置的子串,即使是由相同的字符组...

  • 回文子串个数

    注意子串和子序列的区别子串:必须连续子序列:可以不连续两者都可以包含字符串本身 解法一:暴力求解 解法二:动态规划

  • 字符串

    说明空串是任意字符串的子串 串中任意个数的连续字符组成的子序列称为该串的子串 不区分大小写判断字符串是否含有子串 ...

  • 数据结构与算法串的基本概述

    串是由零个或多个字符组成的有限序列串中任意个连续的字符组成的子序列称为该串的子串,包含子串的串相应称为主串子串在主...

  • golang标准库之strings包

    Contains 判断字符串是否包含子串 判断相等&子串计数 计算索引 大小写转换 字符串拆分&拼接 字符串替换 ...

  • 2019-08-24 Java字符串处理

    我使用的contains方法来判断一个字符串中是否包含某个数字,将数字转为字符串,然后判断是否包含。转换为字符串的...

  • 判断两个字符串是否包含相同的字符

    问题:如何判断两个字符串儿是否包含相同的字符?   两个字符串儿包含相同的字符,是指它们所包含的字符个数相同,并且...

  • ES6学习笔记-字符串拓展的方法

    一、子串的识别 ES6 之前判断字符串是否包含子串,用 indexOf 方法,ES6 新增了子串的识别方法。1、i...

  • iOS面试题

    1.NSString如何计算字符的个数? 应该是用countElements的函数来统计字符串所包含的字符个数,把...

网友评论

      本文标题:包含子串的个数

      本文链接:https://www.haomeiwen.com/subject/onplaltx.html