30. 串联所有单词的子串 C#实现

news/2024/10/30 18:34:54/

30. 串联所有单词的子串

困难

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

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

  • 例如,如果 words = ["ab","cd","ef"], 那么 "abcdef", "abefcd""cdabef", "cdefab""efabcd", 和 "efcdab" 都是串联子串。 "acdbef" 不是串联子串,因为他不是任何 words 排列的连接。

返回所有串联子串在 s 中的开始索引。你可以以 任意顺序 返回答案。

示例 1:

输入:s = "barfoothefoobarman", words = ["foo","bar"]
输出:[0,9]
解释:因为 words.length == 2 同时 words[i].length == 3,连接的子字符串的长度必须为 6。
子串 "barfoo" 开始位置是 0。它是 words 中以 ["bar","foo"] 顺序排列的连接。
子串 "foobar" 开始位置是 9。它是 words 中以 ["foo","bar"] 顺序排列的连接。
输出顺序无关紧要。返回 [9,0] 也是可以的。

示例 2:

输入:s = "wordgoodgoodgoodbestword", words = ["word","good","best","word"]
输出:[]
解释:因为 words.length == 4 并且 words[i].length == 4,所以串联子串的长度必须为 16。
s 中没有子串长度为 16 并且等于 words 的任何顺序排列的连接。
所以我们返回一个空数组。

示例 3:

输入:s = "barfoofoobarthefoobarman", words = ["bar","foo","the"]
输出:[6,9,12]
解释:因为 words.length == 3 并且 words[i].length == 3,所以串联子串的长度必须为 9。
子串 "foobarthe" 开始位置是 6。它是 words 中以 ["foo","bar","the"] 顺序排列的连接。
子串 "barthefoo" 开始位置是 9。它是 words 中以 ["bar","the","foo"] 顺序排列的连接。
子串 "thefoobar" 开始位置是 12。它是 words 中以 ["the","foo","bar"] 顺序排列的连接。

提示:

  • 1 <= s.length <= 104
  • 1 <= words.length <= 5000
  • 1 <= words[i].length <= 30
  • words[i] 和 s 由小写英文字母组成

代码如下:

public class Solution {public IList<int> FindSubstring(string s, string[] words) {IList<int> result = new List<int>();if (s == null || s.Length == 0 || words == null || words.Length == 0) return result;int wordLength = words[0].Length;int wordCount = words.Length;int totalLength = wordLength * wordCount;// 统计 words 中每个单词出现的次数Dictionary<string, int> wordFrequency = new Dictionary<string, int>();foreach (var word in words){if (wordFrequency.ContainsKey(word))wordFrequency[word]++;elsewordFrequency[word] = 1;}// 从每个可能的起点开始(0 到 wordLength-1),使用滑动窗口for (int i = 0; i < wordLength; i++){int left = i;int right = i;int matchedWords = 0;Dictionary<string, int> seenWords = new Dictionary<string, int>();// 移动右指针遍历字符串while (right + wordLength <= s.Length){// 从字符串中取出一个单词string word = s.Substring(right, wordLength);right += wordLength;// 检查当前单词是否在 wordFrequency 中if (wordFrequency.ContainsKey(word)){// 更新 seenWords 中的计数if (seenWords.ContainsKey(word))seenWords[word]++;elseseenWords[word] = 1;matchedWords++;// 如果当前单词的数量超过了所需数量,缩小窗口while (seenWords[word] > wordFrequency[word]){string leftWord = s.Substring(left, wordLength);seenWords[leftWord]--;matchedWords--;left += wordLength;}// 当窗口大小正好等于 totalLength 时,表示找到一个符合要求的子串if (matchedWords == wordCount)result.Add(left);}else{// 如果单词不在 words 中,重置窗口seenWords.Clear();matchedWords = 0;left = right;}}}return result;}
}


http://www.ppmy.cn/news/1543163.html

相关文章

前端js中如何保护密钥?

在前端js编程中&#xff0c;如果涉及到加密通信、加密算法&#xff0c;经常会用到密钥。 但密钥&#xff0c;很容易暴露。暴露原因&#xff1a;js代码透明&#xff0c;在浏览器中可以查看源码&#xff0c;从中找到密钥。 例如&#xff0c;下面的代码中&#xff0c;变量key是密…

Soanrquber集成Gitlab 之 gitlab用户配置和身份验证

集成Gitlab &#xff1a; gitlab用户配置和身份验证 说明&#xff1a; 使得Sonarquber的用户登录与Gitlab的用户登录/认证模块同步 什么是 SonarQube&#xff1f; SonarQube 是一个开源的代码质量管理平台&#xff0c;用于持续检查和分析代码的质量和安全性。它提供了多种功…

漏洞挖掘 | 基于mssql数据库的sql注入

前记 今天挖edu随意点开个站&#xff0c;发现存在mssql数据库的sql注入&#xff0c;在此分享下整个挖掘过程 目录 0x1 判断网站数据库类型 0x2 了解mssql数据库的主要三大系统表 0x3 了解mssql的主要函数 0x4 判断注入点及其注入类型 0x5 联合查询之判断列数 0x6 联合查询之…

C++ 在项目中使用vim

一&#xff1a;概述 除了掌握 Vim 的基本操作&#xff0c;利用 Vim 阅读项目源码的方法同样重要&#xff0c;这对实际项目开发大有裨益。虽然现在有许多人选择使用 VSCode&#xff0c;但在某些环境中&#xff0c;可能无法安装 VSCode 或联网下载插件&#xff0c;这时使用 Vim 就…

2023IKCEST第五届“一带一路”国际大数据竞赛--社交网络中多模态虚假 媒体内容核查top11

比赛链接&#xff1a;https://aistudio.baidu.com/competition/detail/1030/0/introduction PPT链接&#xff1a;https://www.ikcest.org/bigdata2024/zlxz/list/page.html 赛题 社交网络中多模态虚假媒体内容核查 背景 随着新媒体时代信息媒介的多元化发展&#xff0c;各种内容…

【verilog】四位全加器

文章目录 前言一、实验原理二、实验过程三、实验结果参考文献 前言 进行 FPGA 全加器 实验 一、实验原理 module adder(ain,bin,cin,cout,s); input ain,bin,cin; output cout,s; assign coutain&bin | ain&cin | bin&cin; assign sain^bin^cin; endmoduletimesc…

Matlab 车牌识别技术

1.1设计内容及要求&#xff1a; 课题研究的主要内容是对数码相机拍摄的车牌&#xff0c;进行基于数字图像处理技术的车牌定位技术和车牌字符分割技术的研究与开发&#xff0c;涉及到图像预处理、车牌定位、倾斜校正、字符分割等方面的知识,总流程图如图1-1所示。 图1-1系统总…

504 Gateway Time-outopenresty

504 Gateway Time-out openresty 问题背景&#xff1a; 当自己点开知乎页面以后&#xff0c;发现官网没有出现任何问题&#xff0c;点击官网以后开始出现各种各样的报错&#xff01; 一下是来源ai的介绍&#xff1a;&#xff08;通过搜索这种形式帮助自己进行记忆&#xff09;…