leetcode-30. Substring with Concatenation of All Words

2024-06-10 18:38

本文主要是介绍leetcode-30. Substring with Concatenation of All Words,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

leetcode-30. Substring with Concatenation of All Words

题目:

You are given a string, s, and a list of words, words, that are all of the same length. Find all starting indices of substring(s) in s that is a concatenation of each word in words exactly once and without any intervening characters.

For example, given:
s: “barfoothefoobarman”
words: [“foo”, “bar”]

You should return the indices: [0,9].
(order does not matter).

O(KN)解法1

这题其实算不上难题。至少是难题中比较简单的。
基本思路就是由于words中的String的长短是一样的,那这样就有比较简单的解法,就是用i从0开始向右移动,找substring(0,words[0],length())是否包含在words中就好。当然针对每个i都需要新建一个hashset,并将words中所有string放进去,每找到一个就删除一个,然后迭代判断直到这个hashset为空为止。
这个思路没什么问题的,我也是照这样做的,但是后来还是出错了,因为words会有重复的情况。所以这种情况下只有用HashMap代替HashSet才行。不过今天时间有点紧,就不写了。
从讨论里找到了两种做法一种就是上面这中做法。。还有一种比较麻烦的做法,也贴出来。两种的复杂度应该都是O(KN)N是S的长度,K是words的长度。应该是比较类似的。个人比较倾向于第一种写法。

public class Solution {public List<Integer> findSubstring(String S, String[] L) {List<Integer> res = new ArrayList<Integer>();if (S == null || L == null || L.length == 0) return res;int len = L[0].length(); // length of each wordMap<String, Integer> map = new HashMap<String, Integer>(); // map for Lfor (String w : L) map.put(w, map.containsKey(w) ? map.get(w) + 1 : 1);for (int i = 0; i <= S.length() - len * L.length; i++) {Map<String, Integer> copy = new HashMap<String, Integer>(map);for (int j = 0; j < L.length; j++) { // checkc if matchString str = S.substring(i + j*len, i + j*len + len); // next wordif (copy.containsKey(str)) { // is in remaining wordsint count = copy.get(str);if (count == 1) copy.remove(str);else copy.put(str, count - 1);if (copy.isEmpty()) { // matchesres.add(i);break;}} else break; // not in L}}return res;}
}

上面就是我之前解释的方法,这里HashMap的建立非常简洁值得借鉴,但是后面for循环其实写的逻辑比较复杂,如果可以写个helper的话程序的思路要清晰的多。
答案来源

O(KN)解法2

public class Solution {// Sliding Window    360ms// ask interviewer if words is empty, should I return empty listpublic List<Integer> findSubstring(String S, String[] L) {List<Integer> res = new LinkedList<>();if (L.length == 0 || S.length() < L.length * L[0].length())   return res;int N = S.length(), M = L.length, K = L[0].length();Map<String, Integer> map = new HashMap<>(), curMap = new HashMap<>();for (String s : L) {if (map.containsKey(s))   map.put(s, map.get(s) + 1);else                      map.put(s, 1);}String str = null, tmp = null;for (int i = 0; i < K; i++) {int count = 0;  // remark: reset count for (int l = i, r = i; r + K <= N; r += K) {str = S.substring(r, r + K);if (map.containsKey(str)) {if (curMap.containsKey(str))   curMap.put(str, curMap.get(str) + 1);else                           curMap.put(str, 1);if (curMap.get(str) <= map.get(str))    count++;while (curMap.get(str) > map.get(str)) {tmp = S.substring(l, l + K);curMap.put(tmp, curMap.get(tmp) - 1);l += K;if (curMap.get(tmp) < map.get(tmp)) count--;}if (count == M) {res.add(l);tmp = S.substring(l, l + K);curMap.put(tmp, curMap.get(tmp) - 1);l += K;count--;}}else {curMap.clear();count = 0;l = r + K;}}curMap.clear();}return res;}
}

答案来源
这种其实感觉写起来很麻烦,而且其实跟第一种差不太多。不是很推荐。

引申

如果words的String如果长度不一样怎么办?。这里是否有什么比较好的方法。。如果题目是这样的话需要思考一下

这篇关于leetcode-30. Substring with Concatenation of All Words的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1048954

相关文章

哈希leetcode-1

目录 1前言 2.例题  2.1两数之和 2.2判断是否互为字符重排 2.3存在重复元素1 2.4存在重复元素2 2.5字母异位词分组 1前言 哈希表主要是适合于快速查找某个元素(O(1)) 当我们要频繁的查找某个元素,第一哈希表O(1),第二,二分O(log n) 一般可以分为语言自带的容器哈希和用数组模拟的简易哈希。 最简单的比如数组模拟字符存储,只要开26个c

30常用 Maven 命令

Maven 是一个强大的项目管理和构建工具,它广泛用于 Java 项目的依赖管理、构建流程和插件集成。Maven 的命令行工具提供了大量的命令来帮助开发人员管理项目的生命周期、依赖和插件。以下是 常用 Maven 命令的使用场景及其详细解释。 1. mvn clean 使用场景:清理项目的生成目录,通常用于删除项目中自动生成的文件(如 target/ 目录)。共性规律:清理操作

2024网安周今日开幕,亚信安全亮相30城

2024年国家网络安全宣传周今天在广州拉开帷幕。今年网安周继续以“网络安全为人民,网络安全靠人民”为主题。2024年国家网络安全宣传周涵盖了1场开幕式、1场高峰论坛、5个重要活动、15场分论坛/座谈会/闭门会、6个主题日活动和网络安全“六进”活动。亚信安全出席2024年国家网络安全宣传周开幕式和主论坛,并将通过线下宣讲、创意科普、成果展示等多种形式,让广大民众看得懂、记得住安全知识,同时还

HDUPlay on Words

1.定理:无向图G有欧拉通路的充分必要条件是G为连通图,并且G仅有两个奇度结点或者无奇度结点。 (1)当G是仅有两个奇度结点的连通图时,G的欧拉通路必以此两个结点为端点。 (2)当G是无奇度结点的连通图时,G必有欧拉回路。 2.一个有向图D具有欧拉通路,当且仅当D是连通的,且除了两个顶点外,其余顶点的入度均等于出度,这两个特殊的顶点中,一个顶点的入度比出度大1,另一个顶点的入度比出度小1

leetcode-24Swap Nodes in Pairs

带头结点。 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode(int x) { val = x; }* }*/public class Solution {public ListNode swapPairs(L

leetcode-23Merge k Sorted Lists

带头结点。 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode(int x) { val = x; }* }*/public class Solution {public ListNode mergeKLists

C++ | Leetcode C++题解之第393题UTF-8编码验证

题目: 题解: class Solution {public:static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num &

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟)

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟) 题目描述 给定一个链表,链表中的每个节点代表一个整数。链表中的整数由 0 分隔开,表示不同的区间。链表的开始和结束节点的值都为 0。任务是将每两个相邻的 0 之间的所有节点合并成一个节点,新节点的值为原区间内所有节点值的和。合并后,需要移除所有的 0,并返回修改后的链表头节点。 思路分析 初始化:创建一个虚拟头节点

C语言 | Leetcode C语言题解之第393题UTF-8编码验证

题目: 题解: static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num & MASK1) == 0) {return

【JavaScript】LeetCode:16-20

文章目录 16 无重复字符的最长字串17 找到字符串中所有字母异位词18 和为K的子数组19 滑动窗口最大值20 最小覆盖字串 16 无重复字符的最长字串 滑动窗口 + 哈希表这里用哈希集合Set()实现。左指针i,右指针j,从头遍历数组,若j指针指向的元素不在set中,则加入该元素,否则更新结果res,删除集合中i指针指向的元素,进入下一轮循环。 /*** @param