乘风破浪:LeetCode真题_030_Substring with Concatenation of All Words

一、前言

   这次我们还是找字符串的索引,不过,需要将另一个字符串列表中的字符串拼接起来,要求全部都拼接并且出现且仅出现一次,然后在字符串中求子串的起始位置。

二、Substring with Concatenation of All Words

2.1 问题

2.2 分析与解决

    其实我们仔细想一下,求子串的索引可以使用工具库来解决,重要的是将字符串列表中的字符串进行组合,假设一共N个字符串,那么有N*(N-1)*...*(1)中组合方式,但是还要考虑到重复的问题,然后求子串即可。这让我们想到了是否可以使用递归来进行组合,这一点是可以的,于是我们在不考虑重复的情况下可以得到解答,就算重复了,最后去除重复的起始点只保留一个即可。这是一种笨办法。

    当然我们还有其他的解法,我们可以通过HashMap的特性,将列表放入其中,然后从字符串s进行遍历,同样的将s进行剪裁和封装,然后进行比较,如果相等则记录索引,就这样遍历完s就可以得到结果了。

class Solution {
public List<Integer> findSubstring(String s, String[] words) {
List<Integer> res = new LinkedList<>();
if(s.length()==0 || words.length==0)
return new ArrayList<>();
HashMap<String,Integer> hs = new HashMap<>();
for (String w:words)
hs.put(w,hs.getOrDefault(w,0)+1);
int wl = words[0].length();
int wLen = words.length*words[0].length();
for (int i = 0 ; i +wLen<=s.length();i++)
{
String curS = s.substring(i,i+wLen);
HashMap<String,Integer> h = new HashMap<>();
for (int j = 0 ; j <curS.length();j+=wl)
h.put(curS.substring(j,j+wl),h.getOrDefault(curS.substring(j,j+wl),0)+1);
if (h.equals(hs))
res.add(i);
}
return res;
}
}

三、总结

通过java的一些特性,我们更快的求得了结果。

乘风破浪:LeetCode真题_030_Substring with Concatenation of All Words的更多相关文章

  1. 乘风破浪:LeetCode真题_041_First Missing Positive

    乘风破浪:LeetCode真题_041_First Missing Positive 一.前言 这次的题目之所以说是难,其实还是在于对于某些空间和时间的限制. 二.First Missing Posi ...

  2. 乘风破浪:LeetCode真题_040_Combination Sum II

    乘风破浪:LeetCode真题_040_Combination Sum II 一.前言 这次和上次的区别是元素不能重复使用了,这也简单,每一次去掉使用过的元素即可. 二.Combination Sum ...

  3. 乘风破浪:LeetCode真题_039_Combination Sum

    乘风破浪:LeetCode真题_039_Combination Sum 一.前言     这一道题又是集合上面的问题,可以重复使用数字,来求得几个数之和等于目标. 二.Combination Sum ...

  4. 乘风破浪:LeetCode真题_038_Count and Say

    乘风破浪:LeetCode真题_038_Count and Say 一.前言     这一道题目,很类似于小学的问题,但是如果硬是要将输入和结果产生数值上的联系就会产生混乱了,因此我们要打破思维定势. ...

  5. 乘风破浪:LeetCode真题_037_Sudoku Solver

    乘风破浪:LeetCode真题_037_Sudoku Solver 一.前言 这次我们对于上次的模型做一个扩展并求解. 二.Sudoku Solver 2.1 问题 2.2 分析与解决     这道题 ...

  6. 乘风破浪:LeetCode真题_036_Valid Sudoku

    乘风破浪:LeetCode真题_036_Valid Sudoku 一.前言 有的时候对于一些基础知识的掌握,对我们是至关重要的,比如ASCII重要字符的表示,比如一些基本类型的长度. 二.Valid ...

  7. 乘风破浪:LeetCode真题_035_Search Insert Position

    乘风破浪:LeetCode真题_035_Search Insert Position 一.前言 这次的问题比较简单,也没有限制时间复杂度,但是要注意一些细节上的问题. 二.Search Insert ...

  8. 乘风破浪:LeetCode真题_034_Find First and Last Position of Element in Sorted Array

    乘风破浪:LeetCode真题_034_Find First and Last Position of Element in Sorted Array 一.前言 这次我们还是要改造二分搜索,但是想法却 ...

  9. 乘风破浪:LeetCode真题_033_Search in Rotated Sorted Array

    乘风破浪:LeetCode真题_033_Search in Rotated Sorted Array 一.前言     将传统的问题进行一些稍微的变形,这个时候我们可能无所适从了,因此还是实践出真知, ...

随机推荐

  1. Ubuntu16.04安装mac主题之图标居中(百度经验)

    ubuntu14.04怎么把桌面任务栏调到下方,像Mac那样的 50 匿名 | 浏览 22789 次 我有更好的答案 2015-11-30 16:58 最佳答案   先看图片,感兴趣往下看.按照步骤一 ...

  2. C# ABP - 创建自己的模块

    本篇文章介绍怎么创建自己的模块,并且使用依赖注入方法进行模块间的无缝结合. 我们创建一下自己的一个会员模块,针对不同的系统都可以用.你们可以看看我是怎么做的,或者从中得到启发. 目录 1.开始创建项目 ...

  3. Lightning Chart 8.4版新功能

    LightningChat V8.4版在如下功能上做了改进 边距 缩放功能 Legend box 的自动定位 正投影 相机orientation与rotation系统 全新3D 坐标空间转换器 Poi ...

  4. Net is as typeof 运行运算符详解

    概述 在了解运行运算符的前提我们需要了解什么是RTTI ,在任何一门面向对象的语言中,都有RTTI这个概念(即 运行时). RTTI(Run-Time Type Identification),通过运 ...

  5. Computer - 在VM7虚拟机中使用主机打印机

    在VM7虚拟机中使用主机打印机 在VMware Workstation 7中提供了一项新的功能:虚拟机可以直接使用主机的打印机.在以前的版本中,如果想在虚拟机中使用主机的打印机,一般是在主机创建“打印 ...

  6. [PHP] 看博客学习插入排序

    定义数组长度变量$len,使用count()函数,参数:数组 for循环数组,条件:从第二个开始,遍历数组,循环内 定义临时变量$temp,赋值当前元素 for循环数组,条件:遍历当前元素前面的所有元 ...

  7. Java并发编程-Executor框架集

    Executor框架集对线程调度进行了封装,将任务提交和任务执行解耦. 它提供了线程生命周期调度的所有方法,大大简化了线程调度和同步的门槛. Executor框架集的核心类图如下: 从上往下,可以很清 ...

  8. Re0:从零学习node.js

    起小项目 express xxx 镜像 npm install npm install npm start 创建自己的端口...

  9. 最小公倍数(BNUOJ30195)

    最小公倍数 Time Limit: 0 ms Case Time Limit: 0 ms Memory Limit: 0 KBSubmit: 17 Accepted: 1 This problem w ...

  10. Fibonacci (hdu1568)数学公式

    Fibonacci Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Subm ...