乘风破浪:LeetCode真题_030_Substring with Concatenation of All Words
乘风破浪: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的更多相关文章
- 乘风破浪:LeetCode真题_041_First Missing Positive
乘风破浪:LeetCode真题_041_First Missing Positive 一.前言 这次的题目之所以说是难,其实还是在于对于某些空间和时间的限制. 二.First Missing Posi ...
- 乘风破浪:LeetCode真题_040_Combination Sum II
乘风破浪:LeetCode真题_040_Combination Sum II 一.前言 这次和上次的区别是元素不能重复使用了,这也简单,每一次去掉使用过的元素即可. 二.Combination Sum ...
- 乘风破浪:LeetCode真题_039_Combination Sum
乘风破浪:LeetCode真题_039_Combination Sum 一.前言 这一道题又是集合上面的问题,可以重复使用数字,来求得几个数之和等于目标. 二.Combination Sum ...
- 乘风破浪:LeetCode真题_038_Count and Say
乘风破浪:LeetCode真题_038_Count and Say 一.前言 这一道题目,很类似于小学的问题,但是如果硬是要将输入和结果产生数值上的联系就会产生混乱了,因此我们要打破思维定势. ...
- 乘风破浪:LeetCode真题_037_Sudoku Solver
乘风破浪:LeetCode真题_037_Sudoku Solver 一.前言 这次我们对于上次的模型做一个扩展并求解. 二.Sudoku Solver 2.1 问题 2.2 分析与解决 这道题 ...
- 乘风破浪:LeetCode真题_036_Valid Sudoku
乘风破浪:LeetCode真题_036_Valid Sudoku 一.前言 有的时候对于一些基础知识的掌握,对我们是至关重要的,比如ASCII重要字符的表示,比如一些基本类型的长度. 二.Valid ...
- 乘风破浪:LeetCode真题_035_Search Insert Position
乘风破浪:LeetCode真题_035_Search Insert Position 一.前言 这次的问题比较简单,也没有限制时间复杂度,但是要注意一些细节上的问题. 二.Search Insert ...
- 乘风破浪:LeetCode真题_034_Find First and Last Position of Element in Sorted Array
乘风破浪:LeetCode真题_034_Find First and Last Position of Element in Sorted Array 一.前言 这次我们还是要改造二分搜索,但是想法却 ...
- 乘风破浪:LeetCode真题_033_Search in Rotated Sorted Array
乘风破浪:LeetCode真题_033_Search in Rotated Sorted Array 一.前言 将传统的问题进行一些稍微的变形,这个时候我们可能无所适从了,因此还是实践出真知, ...
随机推荐
- Linux下Nginx访问web目录提示403Forbidden
在Linux下http服务器nginx时,访问web目录提示403 Forbidden,首先需要了解nginx出现403错误是什么意思: 403 Forbidden表示你在请求一个资源文件但是ngin ...
- java中带参数的try(){}语法
带资源的try语句(try-with-resource)的最简形式为: try(Resource res = xxx)//可指定多个资源 { work with res } try块退出时,会自动调用 ...
- js 筛选数据
<input type="text" id="filterName"> <div class="scope fr"> ...
- ADO.NET获取数据(DataSet)同时获取表的架构
普通的ADO.NET获取DataSet的写法如下: using System.Configuration; using System.Data; using System.Data.SqlClient ...
- 【Java并发编程】7、线程池
1. 为什么使用线程池 诸如 Web 服务器.数据库服务器.文件服务器或邮件服务器之类的许多服务器应用程序都面向处理来自某些远程来源的大量短小的任务.请求以某种方式到达服务器,这种方式可能是通过网络协 ...
- Binary Tree Traversals(HDU1710)二叉树的简单应用
Binary Tree Traversals Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/O ...
- Android的Intent你知道多少?
https://blog.csdn.net/sinat_34383316/article/details/76039483 https://blog.csdn.net/u014492609/artic ...
- AOP 应用 性能
AOP 我的感觉是做些日志什么的比较好,比如在每个controller的api前后搞一下,或者做些metric.今天在spring里用了下AOP并简单的测了一下性能. 使用 业务类 public cl ...
- 【代码笔记】iOS-长条蓝色button
一,效果图. 二,代码. ViewController.m - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup ...
- 【代码笔记】iOS-去掉NSString中的空格
一,代码. - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, ...