这道题让我从早做到晚-3-……

设len=words[0].length()。

一开始我按照words的顺序扩大区间,发现这样就依赖words的顺序。之后改成遍历s的所有长度为len*words.length的区间,超时,因为没有重复利用信息,只是单纯的暴力,每次i++移动一个单位是无法重复利用信息的。

要重复利用,只能每次移动len,这是能遍历所有情况的,以0~len-1为开头,每次移动len,就能遍历所有可能的情况。

话说hashmap是真的快,比数组遍历快得多

 1   public List<Integer> findSubstring(String s, String[] words) {
2 if (s == null || words == null || words.length == 0 || s.length() == 0) return new ArrayList<>();
3
4 int i, j, k, z;
5 HashMap<String, Integer> MAP = new HashMap<>();
6 HashMap<String, Integer> map = new HashMap<>();
7 ArrayList<Integer> al = new ArrayList<>();
8 StringBuilder sb = new StringBuilder(s);
9
10 for (i = 0; i < words.length; i++) MAP.put(words[i], MAP.getOrDefault(words[i], 0) + 1);
11
12 int len = words[0].length();
13
14 String tmp, t2;
15 for (k = 0; k < len; k++) {
16 map.clear();
17 map.putAll(MAP);
18
19 OUT:
20 for (i = k, j = k; j + len <= s.length(); j += len) {
21 tmp = sb.substring(j, j + len);
22 if (!map.containsKey(tmp)) {
23 for (z = i; z < j; z += len) {
24 tmp = sb.substring(i, i + len);
25 map.put(tmp, map.get(tmp) + 1);
26 }
27 i = j + len;
28 continue;
29 }
30 map.put(tmp, map.get(tmp) - 1);
31 while (map.get(tmp) < 0 && i + len <= j) {
32 t2 = sb.substring(i, i + len);
33
34 map.put(t2, map.get(t2) + 1);
35 i += len;
36 }
37 for (Integer v : map.values()) if (v != 0) continue OUT;
38 al.add(i);
39 t2 = sb.substring(i, i + len);
40 map.put(t2, map.get(t2) + 1);
41 i += len;
42 }
43 }
44 return al;
45 }

最新文章

  1. TeamViewer12.0.71503(远程控制软件)精简版 单文件企业版介绍
  2. centos7.2进入单用户模式
  3. 【java】[转]标记接口和标记注解注解
  4. SimpleInjector的使用
  5. 找出进程中各线程cpu消耗情况
  6. jQuery+CSS 简单代码实现遮罩层( 兼容主流浏览器 )
  7. C 语言中 free() 函数简单分析
  8. C语言中字符串常量到底存在哪了?
  9. Swift编程语言学习10—— 枚举属性监视器
  10. 前端性能优化--图片处理(Css Sprites 与 base64)
  11. 2.7 json 模块
  12. HTML复习 2019-2-11
  13. HDU 2844 Coins 【多重背包】(模板)
  14. docker仓库harbor搭建随笔
  15. mongodb副本集数据同步的踩坑
  16. BugPhobia开发篇章:Beta阶段第III次Scrum Meeting
  17. Linux扩展文件分区
  18. socket.io笔记三之子命名空间的socket连接
  19. DevExpress中Tile Application窗体的模型架构图
  20. vscode 代码保存时自动格式化成 ESLint 风格

热门文章

  1. [IOI2016] shortcut
  2. Exception in thread &amp;amp;quot;main&amp;amp;quot; java.lang.ArrayIndexOutOfBoundsException: 1
  3. 将IoTdb注册为Windows服务
  4. 【ASP.NET Core】动态映射MVC路由
  5. .Net6 使用 Ocelot + Consul 看这篇就够了
  6. SSM中PageHelper的使用方法
  7. Grafana 系列文章(十一):Loki 中的标签如何使日志查询更快更方便
  8. 如何避免让线程摸鱼,请用异步技术 async await 拿捏他~
  9. ResponseBodyAdvice处理返回数据
  10. excel空格处理