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

开发工具与关键技术: 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;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

奶糖微咸

每一分都会是下一篇高能的燃料~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值