【LeetCode算法 - C#】30.串联所以单词的子串

发布于:2023-01-09 ⋅ 阅读:(390) ⋅ 点赞:(0)
开发工具与关键技术: 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 后查看

网站公告

今日签到

点亮在社区的每一天
去签到