当前位置: 首页 > news >正文

day15(11.15)——leetcode面试经典150

30. 串联所有单词的子串

30.串联所有单词的子串

题目:

题解:

这是我一开始写的,我想的是通过组合排列的方式进行拼接好所有字符串,然后再一个一个判断在s中能否找到,这样内存直接爆了我服了哈哈哈哈哈

import java.util.*;class Solution {public List<Integer> findSubstring(String s, String[] words) {if (words == null || words.length == 0 || s.isEmpty()) {return new ArrayList<>();}// 每次调用都创建新的局部变量,避免全局污染!List<String> list = new ArrayList<>();StringBuilder ls = new StringBuilder();boolean[] bs = new boolean[words.length];// 生成所有唯一排列(注意:words 可能有重复,需去重)dfs(0, bs, words, ls, list);// 去重(因为 words 可能有重复元素,如 ["bar","bar"])Set<String> uniqueSet = new LinkedHashSet<>(list);List<Integer> result = new ArrayList<>();for (String concat : uniqueSet) {int index = s.indexOf(concat);while (index != -1) {result.add(index);index = s.indexOf(concat, index + 1); // 修复:+1 避免死循环!}}return result;}private void dfs(int depth, boolean[] used, String[] words, StringBuilder path, List<String> result) {if (depth == words.length) {result.add(path.toString());return;}for (int i = 0; i < words.length; i++) {if (!used[i]) {used[i] = true;path.append(words[i]);dfs(depth + 1, used, words, path, result);path.delete(path.length() - words[i].length(), path.length());used[i] = false;}}}
}

然后就换了一个方法,用双指针+哈希map进行计数:
 

class Solution {public List<Integer> findSubstring(String s, String[] words) {List<Integer> res = new ArrayList<>();//进行特判//字符串不可能为nullif(s.length() == 0 || words == null || words.length == 0 ) {return res;}//进行设置变量:每个单词的长度、单词的个数、拼接好的字符串的长度//每个单词的长度int wordLen = words[0].length();//单词的个数int len = words.length;//拼接好的字符串的长度int wordsLen = len*wordLen;//设计map进行统计每个单词出现的次数Map<String,Integer> map = new HashMap<>();for(String word:words) {map.put(word,map.getOrDefault(word, 0)+1);}//滑动窗口进行设置//外层循环 for (int i = 0; i < wordLen; i++) 的作用:处理对齐问题for(int i=0;i<wordLen;i++) {//设置左右边界int left=i,right=i;//创建一个新的统计map序列Map<String,Integer> mp = new HashMap<>();while(right+wordLen<=s.length()) {//截取当前得到的单词String str = s.substring(right,right+wordLen);//更新right的位置right+=wordLen;//在map中不存在strif(!map.containsKey(str)) {// 说明一整个序列都不符合mp.clear();// 直接跳过这个序列left = right;}//当前截取的str在map中存在else {//进行统计单词频数mp.put(str, mp.getOrDefault(str, 0)+1);//进行判断当前的mp各个单词的数量是否超过数组中统计的mapwhile(map.get(str)<mp.get(str)) {//直接删去两个重复的,但我们并不确定重复的位置,所以只能从left一直试探String leftWord = s.substring(left,left+wordLen);mp.put(leftWord, mp.getOrDefault(leftWord,0)-1);// 进行更新leftleft+=wordLen;}}if(right-left == wordsLen) {res.add(left);}}}return res;}
}

http://www.dtcms.com/a/614507.html

相关文章:

  • LED闪烁功能代码详解
  • 这几年做哪些网站致富基于ssh框架的网站开发流程
  • 远程(本地)连接不上虚拟机
  • Ubunntu24.04 下载jdk 8
  • SpringCache详细教学使用
  • 39Nginx的rewrite规则执行逻辑详解
  • C++—priority_queue/仿函数:优先级队列的使用及模拟实现
  • 做网站哪些dw使用模板做网站教程
  • 深圳市光明建设发展集团网站网站建设面谈话术
  • Java EE进阶5:Spring IoCDI
  • 中专生学历提升与职业发展指南
  • 易语言怎么反编译 | 如何通过反编译理解易语言的工作原理与破解技巧
  • 阿里国际站韩语网站怎么做百度帐号个人中心
  • EnsembleRetriever中的倒数融合排序算法
  • 网站客户端制作多少钱wordpress导出html
  • 银河麒麟高级服务器系统(V11)的安装部署实操保姆级教程
  • 202552读书笔记|《漫步在晴朗的日子里》——拥有一颗坚定的心去面对朝花夕拾,潮涨潮落
  • 物流查询网站开发青岛网站建设好不好
  • C#20、什么是LINQ
  • Springboot加盟平台推荐可视化系统ktdx2ldg(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
  • 公网动态ip如何做网站网站项目建设周期
  • 路由器选择需关注无线传输速率、端口配置与信号覆盖
  • php网站建设论文答辩温州手机建站模板
  • 达梦的dbms_lock在DSC中能用吗
  • 前端微前端部署方案,Nginx与Webpack
  • 网站建站系统ps软件下载电脑版多少钱
  • c++ easylogging 使用示例
  • Holdout机制:推荐系统中评估部门级业务贡献的黄金标准
  • 地域性旅游网站建设系统结构品牌公司网站设计
  • 4k中国视频素材网站wordpress用哪个版本