LeetCode算法题目030 : 串联所有单词的子串

给定一个字符串 s 和一些长度相同的单词 words。找出 s 中恰好可以由 words 中所有单词串联形成的子串的起始位置。
注意子串要与 words 中的单词完全匹配,中间不能有其他字符,但不需要考虑 words 中单词串联的顺序。

示例 1:
输入:
s = “barfoothefoobarman”,
words = [“foo”,”bar”]
输出:[0,9]
解释:
从索引 0 和 9 开始的子串分别是 “barfoo” 和 “foobar” 。
输出的顺序不重要, [9,0] 也是有效答案。

示例 2:
输入:
s = “wordgoodgoodgoodbestword”,
words = [“word”,”good”,”best”,”word”]
输出:[]
难度:困难

 public List findSubstring(String s, String[] words) {
        List list = new ArrayList<>();
        if (s.length() == 0 || words.length == 0) return list;
        int wordLen = words[0].length();
        int wordNum = words.length;
        Map allWords = new HashMap<>();
        for (String word : words) {
            int num = allWords.getOrDefault(word, 0);
            allWords.put(word, num + 1);
        }
        for (int i = 0; i < s.length() - wordNum * wordLen + 1; i++) {
            HashMap hasWords = new HashMap();
            int num = 0;
            while (num < wordNum) {
                String word = s.substring(i + num * wordLen, i + (num + 1) * wordLen);
                if (allWords.containsKey(word)) {
                    int value = hasWords.getOrDefault(word, 0);
                    hasWords.put(word, value + 1);
                    if (hasWords.get(word) > allWords.get(word)) {
                        break;
                    }
                } else {
                    break;
                }
                num++;
            }
            if (num == wordNum) {
                list.add(i);
            }
        }
        return list;
    }

已发布

分类

作者:

标签

评论

《“LeetCode算法题目030 : 串联所有单词的子串”》 有 2 条评论

  1. kami 的头像
    kami

    EMMMMM
     ̄﹃ ̄

  2. kami 的头像
    kami

    EMMMMM
     ̄﹃ ̄

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注