30. Substring with Concatenation of All Words (JAVA)
You are given a string, s, and a list of words, words, that are all of the same length. Find all starting indices of substring(s) in s that is a concatenation of each word in words exactly once and without any intervening characters.
Example 1:
Input:
s = "barfoothefoobarman",
words = ["foo","bar"]
Output:[0,9]
Explanation: Substrings starting at index 0 and 9 are "barfoor" and "foobar" respectively.
The output order does not matter, returning [9,0] is fine too.
Example 2:
Input:
s = "wordgoodgoodgoodbestword",
words = ["word","good","best","word"]
Output:[]
class Solution {
    public List<Integer> findSubstring(String s, String[] words) {
        List<Integer> ret = new ArrayList<>();
        if(words==null || words.length==0) return ret;
        int start; //start index of s
        int cur; //current index of s
        Map<String, Integer> wordCnt= new HashMap<String, Integer>(); //count of each word
        Map<String, Integer> strCnt= new HashMap<String, Integer>(); //count of each word while traversing string
        String w;
        String w_to_del;
        int startIndex;
        int cnt;
        int len = words[0].length();
        int strLen = words.length * len;
        //initialize map
        for(String str: words){
            wordCnt.put(str,wordCnt.getOrDefault(str,0)+1);
        }
        for(int j = 0; j < len; j++){ //word可能会出现在s的任意位置,而非仅仅0,len,2*len...的位置
            startIndex = j;
            strCnt.clear();
            for(int i = j; i <= s.length()-len; i+=len){
                w = s.substring(i,i+len);
                if(wordCnt.containsKey(w)){ //word in words
                    strCnt.put(w, strCnt.getOrDefault(w,0)+1);
                    //number of word in string is more than that in words array, move right startIndex
                    while(strCnt.get(w) > wordCnt.get(w)){
                        w_to_del = s.substring(startIndex,startIndex+len);
                        strCnt.put(w_to_del,strCnt.get(w_to_del)-1);
                        startIndex += len;
                    }   
                    //find a match
                    if(i + len - startIndex == strLen){
                        ret.add(startIndex);
                        //start to find another match from startIndex+len
                        w_to_del = s.substring(startIndex,startIndex+len);
                        strCnt.put(w_to_del,strCnt.get(w_to_del)-1);
                        startIndex += len;
                    }
                }
                else{ //word not in words
                    startIndex = i+len;
                    strCnt.clear();
                }
            }
        }
        return ret;
    }
}
时间复杂度:通过window的方式,在每个word的起始位置,只要遍历一遍s,就能完成查询。一共有size =words.length个起始位置,所以时间复杂度是O(n*size),其中n为s的长度,在s很长的时候,可以认为size是可忽略的常量,时间复杂度为O(n)。
30. Substring with Concatenation of All Words (JAVA)的更多相关文章
- LeetCode - 30. Substring with Concatenation of All Words
		
30. Substring with Concatenation of All Words Problem's Link --------------------------------------- ...
 - [Leetcode][Python]30: Substring with Concatenation of All Words
		
# -*- coding: utf8 -*-'''__author__ = 'dabay.wang@gmail.com' 30: Substring with Concatenation of All ...
 - [LeetCode] 30. Substring with Concatenation of All Words 解题思路 - Java
		
You are given a string, s, and a list of words, words, that are all of the same length. Find all sta ...
 - leetCode 30.Substring with Concatenation of All Words (words中全部子串相连) 解题思路和方法
		
Substring with Concatenation of All Words You are given a string, s, and a list of words, words, tha ...
 - LeetCode HashTable 30 Substring with Concatenation of All Words
		
You are given a string, s, and a list of words, words, that are all of the same length. Find all sta ...
 - Java [leetcode 30]Substring with Concatenation of All Words
		
题目描述: You are given a string, s, and a list of words, words, that are all of the same length. Find a ...
 - 30. Substring with Concatenation of All Words
		
题目: You are given a string, s, and a list of words, words, that are all of the same length. Find all ...
 - [LeetCode] 30. Substring with Concatenation of All Words 串联所有单词的子串
		
You are given a string, s, and a list of words, words, that are all of the same length. Find all sta ...
 - 【LeetCode】30. Substring with Concatenation of All Words
		
You are given a string, s, and a list of words, words, that are all of the same length. Find all sta ...
 
随机推荐
- Mac item2常用快捷键
			
记录一下iterm 2 快捷键,用于备忘! 标签 新建标签:command + t 关闭标签:command + w 切换标签:command + 数字 command + 左右方向键 切换全屏:co ...
 - Spring Boot教程(十二)整合elk(1)
			
elk 简介 Elasticsearch是个开源分布式搜索引擎,它的特点有:分布式,零配置,自动发现,索引自动分片,索引副本机制,restful风格接口,多数据源,自动搜索负载等. Logstash是 ...
 - elasticsearch-head插件的安装
			
2.4.1 安装nodejs Node.js是一个基于 Chrome V8 引擎的 JavaScript 运行环境. Node.js是一个Javascript运行环境(runtime environm ...
 - python之新式类与经典类
			
经典类与新式类 经典类:P 或 P()--深度查找,向上查父节点 新式类 :P(object)---广度查找,继承object,新式类的方法较多
 - 添加tomcat为启动服务/删除tomcat服务
			
在很多生产把环境下,tomcat的启动要随着windows的启动一起启动,这个时候就需要将tomcat添加成服务.步骤如下: 1:环境配置 配置jdk环境变量: JAVA_HOME:jdk路径 配置p ...
 - String2LongUtil
			
public class String2LongUtil { /** * String类型转换成date类型 * strTime: 要转换的string类型的时间, * formatType: 要转换 ...
 - 【原创实现】C 多线程入门Demo CAS Block 2种模式实现
			
分Cas和Block模式实现了demo, 供入门学习使用,代码全部是远程实现. 直接上代码: /* ================================================== ...
 - 文件的权利和sudoers中规定的权限哪个更大?
			
文件的权利和sudoers中规定的权限哪个更大? 当然是文件的权限更大!!! 这也是linux的 更安全的根本所在! 就是它的每一个文件都有严格的 rwxr--r-- 权限规定. 只有文件权限规定了的 ...
 - Django学习之缓存
			
1.配置 2.应用 由于Django是动态网站,所有每次请求均会去数据进行相应的操作,当程序访问量大时,耗时必然会更加明显,最简单解决方式是使用:缓存.缓存将一个某个views的返回值保存至内存或者m ...
 - hibernate的查询
			
1.条件查询 public List<Weibo> selectOne(int k){ Session session = HibernateUtil.currentSession(); ...