串联所有单词的子串

题目描述:给定一个字符串 s 和一些长度相同的单词 words。找出 s 中恰好可以由 words 中所有单词串联形成的子串的起始位置。

注意子串要与 words 中的单词完全匹配,中间不能有其他字符,但不需要考虑 words 中单词串联的顺序。

示例:输入:

  s = "barfoothefoobarman",

  words = ["foo","bar"]

输出:[0,9]

解释:

从索引 0 和 9 开始的子串分别是 "barfoor" 和 "foobar" 。

输出的顺序不重要, [9,0] 也是有效答案。

java代码

class Solution {

    public List findSubstring(String s, String[] words) {

        List res = new ArrayList();

        int wordNum = words.length;

        if(wordNum == 0) return res;

        int wordLen = words[0].length();

        //HashMap1存所有单词

        HashMap allWords = new HashMap();

        for(String w:words) {

            int value = allWords.getOrDefault(w,0);

            allWords.put(w,value+1);

        }

        //遍历所有子串

        for(int i=0;i

            //HshMap2存当前扫描的字符串含有的单词

            HashMap hasWords = new HashMap();

            int num = 0;

            while(num < wordNum) {

                String word = s.substring(i + num*wordLen,i+(num+1)*wordLen);

                //判断该单词是否在HashMap1中

                if(allWords.containsKey(word)) {

                    int value = hasWords.getOrDefault(word,0);

                    hasWords.put(word,value+1);

                    //判断当前单词的value和HashMap1中该单词的value

                    if(hasWords.get(word) > allWords.get(word)) {

                        break;

                    }

                }else {

                    break;

                }

                num++;

            }

            if(num == wordNum) {

                res.add(i);

            }

        }

        return res;

    }

}

你可能感兴趣的:(串联所有单词的子串)