开发工具与关键技术: C#
作者:奶糖不甜🍬
撰写时间:2022.8.17
C#是微软公司发布的一种由C和C++衍生出来的面向对象的编程语言、运行于.NET Framework和.NET Core之上的高级程序设计语言.并定于在微软职业开发者论坛(PDC)上登台亮相。C#是微软公司研究员Anders Hejlsberg的最新成果.C#看起来与Java有着惊人的相似;它包括了诸如单一继承、接口、与Java几乎同样的语法和编译成中间代码再运行的过程。但是C#与Java有着明显的不同,它借鉴了Delphi的一个特点,与COM是直接集成的,而且它是微软公司 .NET windows网络框架的主角。
题目描述:
给定一个字符串 s 和一些 长度相同 的单词 words 。找出 s 中恰好可以由 words 中所有单词串联形成的子串的起始位置。
注意子串要与 words 中的单词完全匹配,中间不能有其他字符 ,但不需要考虑 words 中单词串联的顺序。
示例 1:
输入:s = “barfoothefoobarman”, words = [“foo”,“bar”]
输出:[0,9]
解释:
从索引 0 和 9 开始的子串分别是 “barfoo” 和 “foobar” 。
输出的顺序不重要, [9,0] 也是有效答案
示例 2:
输入:s = “wordgoodgoodgoodbestword”, words = [“word”,“good”,“best”,“word”]
输出:[]
滑动窗口解法:
public class Solution {
public IList<int> FindSubstring(string s, string[] words) {
IList<int> res = new List<int>();
int m = words.Length, n = words[0].Length, ls = s.Length;
for (int i = 0; i < n; i++) {
if (i + m * n > ls) {
break;
}
Dictionary<string, int> differ = new Dictionary<string, int>();
for (int j = 0; j < m; j++) {
string word = s.Substring(i + j * n, n);
if (!differ.ContainsKey(word)) {
differ.Add(word, 0);
}
differ[word]++;
}
foreach (string word in words) {
if (!differ.ContainsKey(word)) {
differ.Add(word, 0);
}
differ[word]--;
if (differ[word] == 0) {
differ.Remove(word);
}
}
for (int start = i; start < ls - m * n + 1; start += n) {
if (start != i) {
string word = s.Substring(start + (m - 1) * n, n);
if (!differ.ContainsKey(word)) {
differ.Add(word, 0);
}
differ[word]++;
if (differ[word] == 0) {
differ.Remove(word);
}
word = s.Substring(start - n, n);
if (!differ.ContainsKey(word)) {
differ.Add(word, 0);
}
differ[word]--;
if (differ[word] == 0) {
differ.Remove(word);
}
}
if (differ.Count == 0) {
res.Add(start);
}
}
}
return res;
}
}
本文含有隐藏内容,请 开通VIP 后查看