30. 串联所有单词的子串

给定一个字符串 s 和一个字符串数组 words。 words 中所有字符串 长度相同。

s 中的 串联子串 是指一个包含 words 中所有字符串以任意顺序排列连接起来的子串。

例如,如果 words = [“ab”,“cd”,“ef”], 那么 “abcdef”, “abefcd”,“cdabef”, “cdefab”,“efabcd”, 和 “efcdab” 都是串联子串。 “acdbef” 不是串联子串,因为他不是任何 words 排列的连接。
返回所有串联子串在 s 中的开始索引。你可以以 任意顺序 返回答案。

C++

class Solution {
public:string nstring(string str,int n){string result_str="";for( int i=0;i<n;i++ ){result_str.append(str);}return result_str;}unordered_map<string,int> list2map(vector<string>& temp_vector){unordered_map<string,int> result_map;for( string temp_str:temp_vector ){result_map[temp_str]++;}return result_map;}void refillmap(unordered_map<string,int>& result_map,unordered_map<string,int>& data_map){for( const auto& pair : result_map ){data_map[pair.first]=pair.second;}}vector<int> findSubstring(string s, vector<string>& words) {vector<int> res;int length = words[0].size();//the length of the word.int total_length=length*words.size();//the total length of the word.if( total_length>s.size() ){return res;}unordered_map<string,int> result_map=list2map(words);unordered_map<string,int> data_map;refillmap(result_map,data_map);string target_str="";if(1==data_map.size()){target_str=nstring(words[0],words.size());}int gap=length;for( int i=0;i<s.size();i++ ){if( s.size()-i<total_length){break;}int n=words.size();if(1==data_map.size()){gap=total_length;string current_str=s.substr(i,gap);    if(current_str==target_str){res.push_back(i);}}else{int a=i;int b=a+(words.size()-1)*length;while( a<=b && n>0 && a<=s.size()-gap && b>=0 ){string current_str=s.substr(a,gap);string last_str=s.substr(b,gap);if(data_map[current_str]>0){data_map[current_str]--;n--;a=a+gap;}else{break;}if(data_map[last_str]>0){data_map[last_str]--;n--;b=b-gap;}else{break;}}if(n<words.size() &&(s.size()-i-1)>=total_length){refillmap(result_map,data_map);}if(0==n){res.push_back(i);}}}return res;}
};

时间复杂度

O ( N ∗ M ) O(N*M) O(NM)

空间复杂度

O ( N ) O(N) O(N)

Java

class Solution {Map<String,Integer> list2map(String [] words){Map<String,Integer> result_map=new HashMap<String,Integer>();for( String str:words ){if(result_map.containsKey(str)){result_map.put(str,result_map.get(str)+1);}else{result_map.put(str,1);}}return result_map;}String nstring(String str,int n){StringBuilder strBuilder=new StringBuilder("");for( int i=0;i<n;i++ ){strBuilder.append(str);}return strBuilder.toString();}void refillmap(Map<String,Integer> result_map,Map<String,Integer> data_map){Set<String> keys = result_map.keySet();for( String key:keys ){data_map.put(key,result_map.get(key));}}public List<Integer> findSubstring(String s, String[] words) {List<Integer> ans=new ArrayList<Integer>();int length=words[0].length();int total_length=words.length*length;if( s.length()<total_length ){return ans;}Map<String,Integer> result_map=list2map(words);Map<String,Integer> data_map=new HashMap<String,Integer>();refillmap(result_map,data_map);for( int i=0;i<s.length();i++ ){if( 1==data_map.size() && i+total_length<s.length() ){String targetString=nstring(words[0],words.length);String tempString=s.substring(i,i+total_length);if(targetString.equals(tempString)){ans.add(i);}}else{int a=i;int b=a+(words.length-1)*length;int n=words.length;while(a<=b && a<=s.length()-length && b<=s.length()-length && b>=0 ){String a_str=s.substring(a,a+length);String b_str=s.substring(b,b+length);if(data_map.containsKey(a_str)&&data_map.get(a_str)>0){data_map.put(a_str,data_map.get(a_str)-1);n--;a=a+length;}else{break;}if(data_map.containsKey(b_str)&&data_map.get(b_str)>0){data_map.put(b_str,data_map.get(b_str)-1);n--;b=b-length;}else{break;}}if(n<words.length){refillmap(result_map,data_map);}if(0==n){ans.add(i);}}}return ans;}
}

时间复杂度

O ( N ∗ M ) O(N*M) O(NM)

空间复杂度

O ( N ) O(N) O(N)

Python

class Solution:def list2map(self,words: List[str]):result_map={};for str in words:result_map[str]=result_map.get(str,0)+1;return result_map;def refillmap(self,result_map):data_map={};keys=result_map.keys();for str in keys:data_map[str]=result_map[str]return data_map;def nstring(self,str,n):result_str="";for i in range(n):result_str=result_str+str;return result_str;def findSubstring(self, s: str, words: List[str]) -> List[int]:ans=[];length=len(words[0]);total_length=len(words)*length;result_map=self.list2map(words);data_map=self.refillmap(result_map);for i in range(len(s)):if 1==len(data_map) and (i+total_length<=len(s)):target_str=self.nstring(words[0],len(words));current_str=s[i:i+total_length];if target_str==current_str:ans.append(i);else:a=i;b=a+(len(words)-1)*length;n=len(words);while a<=b and a<=len(s)-length and b>=0 and b<=len(s)-length:a_str=s[a:a+length];b_str=s[b:b+length];if a_str in data_map and data_map.get(a_str)>0:data_map[a_str]=data_map.get(a_str)-1;n=n-1;a=a+length;else:break;if b_str in data_map and  data_map.get(b_str)>0:data_map[b_str]=data_map.get(b_str)-1;n=n-1;b=b-length;else:break;if n<len(words):data_map=self.refillmap(result_map);if 0==n:ans.append(i);return ans;

时间复杂度

O ( N ∗ M ) O(N*M) O(NM)

空间复杂度

O ( N ) O(N) O(N)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/23797.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

8.spring对logback的支持

文章目录 一、入口二、源码解析LoggingApplicationListener 三、其它支持四、总结 本节以logback为背景介绍的 一、入口 gav: org.springframework.boot:spring-boot:3.3.4 spring.factories文件中有如下两个配置 org.springframework.boot.logging.LoggingSystemFactory\ …

OpenHarmony分布式数据管理子系统

OpenHarmony分布式数据管理子系统 简介 目录 组件说明 分布式数据对象数据共享分布式数据服务Key-Value数据库首选项关系型数据库标准数据化通路 相关仓 简介 子系统介绍 分布式数据管理子系统支持单设备的各种结构化数据的持久化&#xff0c;以及跨设备之间数据的同步、…

智慧后勤的消防管理:豪越科技为安全护航

智慧后勤消防管理难题大揭秘&#xff01; 在智慧后勤发展得如火如荼的当下&#xff0c;消防管理却暗藏诸多难题。传统模式下&#xff0c;消防设施分布得那叫一个散&#xff0c;就像一盘散沙&#xff0c;管理起来超费劲。人工巡检不仅效率低&#xff0c;还容易遗漏&#xff0c;不…

python轻量级框架-flask

flask简述 Flask 是 Python 生态圈中一个基于 Python 的Web 框架。其轻量、模块化和易于扩展的特点导致其被广泛使用&#xff0c;适合快速开发 Web 应用以及构建小型到中型项目。它提供了开发 Web 应用最基础的工具和组件。之所以称为微框架&#xff0c;是因为它与一些大型 We…

政安晨【零基础玩转各类开源AI项目】DeepSeek 多模态大模型Janus-Pro-7B,本地部署!支持图像识别和图像生成

政安晨的个人主页&#xff1a;政安晨 欢迎 &#x1f44d;点赞✍评论⭐收藏 希望政安晨的博客能够对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff01; 目录 下载项目 创建虚拟环境 安装项目依赖 安装 Gradio&#xff08;UI&#xff09; 运…

在 Mac mini M2 上本地部署 DeepSeek-R1:14B:使用 Ollama 和 Chatbox 的完整指南

随着人工智能技术的飞速发展&#xff0c;本地部署大型语言模型&#xff08;LLM&#xff09;已成为许多技术爱好者的热门选择。本地部署不仅能够保护隐私&#xff0c;还能提供更灵活的使用体验。本文将详细介绍如何在 Mac mini M2&#xff08;24GB 内存&#xff09;上部署 DeepS…

【Godot4.3】基于绘图函数的矢量蒙版效果与UV换算

概述 在设计圆角容器时突发奇想&#xff1a; 将圆角矩形的每个顶点坐标除以对应圆角矩形所在Rect2的size&#xff0c;就得到了顶点对应的UV坐标。然后使用draw_colored_polygon&#xff0c;便可以做到用图片填充圆角矩形的效果。而且这种计算的效果就是图片随着其填充的图像缩…

51单片机-AT24CXX存储器工作原理

1、AT24CXX存储器工作原理 1.1、特点&#xff1a; 与400KHz&#xff0c;I2C总线兼容1.8到6.0伏工作电压范围低功耗CMOS技术写保护功能当WP为高电平时进入写保护状态页写缓冲器自定时擦写周期100万次编程/擦除周期可保存数据100年8脚DIP SOIC或TSSOP封装温度范围商业级和工业级…

Linux网络 网络层

IP 协议 协议头格式 4 位版本号(version): 指定 IP 协议的版本, 对于 IPv4 来说, 就是 4. 4 位头部长度(header length): IP 头部的长度是多少个 32bit, 也就是 4 字节&#xff0c;4bit 表示最大的数字是 15, 因此 IP 头部最大长度是 60 字节. 8 位服务类型(Type Of Service):…

Unity百游修炼(1)——FootBall详细制作全流程

一、引言 游玩测试&#xff1a; Football 游玩测试 1.项目背景与动机 背景&#xff1a;在学习 Unity 的过程中&#xff0c;希望通过实际项目来巩固所学知识&#xff0c;同时出于对休闲小游戏的喜爱&#xff0c;决定开发一款简单有趣的小游戏加深自己的所学知识点。 动机&#…

C语言(13)------------>do-while循环

1.do-while循环的语法 我们知道C语言有三大结构&#xff0c;顺序、选择、循环。我们可以使用while循环、for循环、do-while循环实现循环结构。之前的博客中提及到了前两者的技术实现。可以参考&#xff1a; C语言&#xff08;11&#xff09;-------------&#xff1e;while循…

【1】VS Code 新建上位机项目---C#基础语法

VS Code 新建上位机项目---C#基础语法 1 基本概念1.1 准备工具1.2 新建项目2 C#编程基础2.1 命名空间和类2.2 数据类型2.3 控制台输入输出2.3.1 输入输出: write 与 read2.3.2 格式化 : string.Foramt() 与 $2.3.3 赋值与运算2.4 类型转换2.4.1 数值类型之间的转换:(int)2.4…

SQL:DQL数据查询语言以及系统函数(oracle)

SQL Structured Query Language&#xff0c;结构化查询语言, 是一种用于管理和操作关系数据库的标准编程语言。 sql的分类 DQL&#xff08;Data Query Language&#xff09;&#xff1a;数据查询语言 DDL&#xff08;Data Definition Language&#xff09;&#xff1a;数据…

从单片机的启动说起一个单片机到点灯发生了什么下——使用GPIO点一个灯

目录 前言 HAL库对GPIO的抽象 核心分析&#xff1a;HAL_GPIO_Init 前言 我们终于到达了熟悉的地方&#xff0c;对GPIO的初始化。经过漫长的铺垫&#xff0c;我们终于历经千辛万苦&#xff0c;来到了这里。关于GPIO的八种模式等更加详细的细节&#xff0c;由于只是点个灯&am…

提效10倍:基于Paimon+Dolphin湖仓一体新架构在阿里妈妈品牌业务探索实践

1. 业务背景 阿里妈妈品牌广告数据包括投放引擎、下发、曝光、点击等日志&#xff0c;面向运筹调控、算法特征、分析报表、诊断监控等应用场景&#xff0c;进行了品牌数仓能力建设。随着业务发展&#xff0c;基于Lambda架构的数仓开发模式&#xff0c;缺陷日益突出&#xff1a;…

一文详解U盘启动UEFI/Legacy方式以及GPT/MBR关系

对于装系统的老手而说一直想研究一下装系统的原理&#xff0c;以及面对一些问题时的解决思路&#xff0c;故对以前的方法进行原理上的解释&#xff0c;主要想理解其底层原理。 引导模式 MBR分区可以同时支持UEFI和Legacy引导&#xff0c;我们可以看一下微pe制作的启动盘&#…

基于Docker的前端环境管理:从开发环境到生产部署的实现方案

# 基于Docker的前端环境管理&#xff1a;从开发环境到生产部署的实现方案 简介及前端开发环境挑战 简介 是一种容器化平台&#xff0c;可以将应用程序及其依赖项打包为一个容器&#xff0c;提供一种轻量级、可移植的环境。它能够简化开发、部署和运维的流程&#xff0c;提高…

连锁管理系统的五大核心设计及 PHP 源码分享

在当今竞争激烈的连锁商业领域&#xff0c;高效的管理系统是企业脱颖而出的关键。商淘云连锁管理系统凭借其卓越的功能和灵活的架构&#xff0c;为连锁企业提供了强大的运营支持。在这里详细介绍其五大核心设计&#xff0c;并分享相关的 PHP 源码示例。 一、总部进销存管理 &a…

C语言基本知识------指针(4)

1. 回调函数是什么&#xff1f; 回调函数就是⼀个通过函数指针调用的函数。 如果你把函数的指针&#xff08;地址&#xff09;作为参数传递给另⼀个函数&#xff0c;当这个指针被⽤来调⽤其所指向的函数 时&#xff0c;被调⽤的函数就是回调函数。 void qsort(void base,//指针…

MTK-Android13-包安装器PackageInstaller 静默安装实现

目的 我们最终是为了搞明白安装的整个流程。一方面通过安卓系统自带的包安装器来了解PMS 安装流程&#xff1b;另一方面熟悉框架层Framework 针对Android apk 安装流程。 前两篇文章分析了PackagerInstaller 安装流程。 Android13-包安装器PackageInstaller-之apk安装跳转 An…