LeetCode 30 —— 30.串联所有单词的子串

ops/2025/4/2 4:19:09/

题目:

给定一个字符串 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 Q0030 {public static void main(String[] args) {demo1();demo2();demo3();}private static void demo1() {String s = "wordgoodgoodgoodbestword";String[] words = {"word", "good", "best", "word"};List<Integer> substring = findSubstring(s, words);System.out.println(substring);}private static void demo2() {String s = "barfoothefoobarman";String[] words = {"foo", "bar"};List<Integer> substring = findSubstring(s, words);System.out.println(substring);}private static void demo3() {String s = "wordgoodgoodgoodbestword";String[] words = {"word", "good", "best", "good"};List<Integer> substring = findSubstring(s, words);System.out.println(substring);}public static List<Integer> findSubstring(String s, String[] words) {List<Integer> result = new ArrayList<Integer>();int length = words[1].length();// i 起始位置for (int i = 0; i < s.length() - length; i++) {List<String> wordsList = new ArrayList<>();for (String word : words) {wordsList.add(word);}StringBuffer stringBuffer = new StringBuffer();for (int after = 0; after < length; after++) {char x = s.charAt(i + after);stringBuffer.append(x);}String string = stringBuffer.toString();if (!wordsList.contains(string)) {continue;} else {int flag = 1;if (flag == 0) {continue;}for (int j = i; j < s.length() - length; j += length) {StringBuffer stringBuffer1 = new StringBuffer();for (int after = 0; after < length; after++) {char x = s.charAt(i + after);stringBuffer1.append(x);}String string1 = stringBuffer1.toString();if (wordsList.contains(string1)) {wordsList.remove(string1);if (wordsList.isEmpty()) {flag = 0;result.add(i);}continue;} else {flag = 0;break;}}}}return result;}
}

Over~


http://www.ppmy.cn/ops/167367.html

相关文章

Jenkins自动化部署pigx项目的实践总结

1、新建任务 新建Item 创建freestyle project的任务 2、配置 配置任务的相关参数 2.1 简单描述 2.1 源码管理 输入源码仓库地址创建访问仓库的账号密码 2.3 构建步骤 选择windows 的命令进行部署服务 2.3.1 部署服务使用的脚本 关闭过去启动的服务 echo off for …

linux 下消息队列

文章目录 &#x1f4e8; Linux System V 消息队列实战一、消息队列核心概念 &#x1f4a1;1. 消息队列特点 &#x1f31f;2. 生命周期 &#x1f504; 二、项目概述三、完整代码实现1. 公共头文件 common.hpp2. 发送端 sender.cpp3. 接收端 receiver.cpp 三、编译与运行指南1. 编…

Python功能完美的宝库——内置的强大“武器库”builtins

builtins模块包含了Python大量的内置对象&#xff08;函数、异常和类型等&#xff09;&#xff0c;她是Python的内置武器库&#xff0c;堪称功能完美的宝库。 笔记模板由python脚本于2025-03-19 08:16:27创建&#xff0c;本篇笔记适合喜欢探究python的coder翻阅。 【学习的细节…

Qt窗口控件之字体对话框QFontDialog

字体对话框QFontDialog QFontDialog 是 Qt 内置的字体对话框&#xff0c;用户能够在这里选择字体的样式、大小&#xff0c;设置加粗和下划线并将结果作为返回值返回。QFontDialog 最好使用其提供的静态函数实例化匿名对象&#xff0c;并获取返回值最为用户选择字体设置的结果。…

【机器学习】强化学习

强化学习&#xff08;Reinforcement Learning, RL&#xff09;是一种机器学习方法&#xff0c;核心思想是通过试错来学习最优策略&#xff0c;以最大化长期收益&#xff08;奖励&#xff09;。它模仿了人类或动物在与环境交互中学习决策的方式。 一、强化学习定义 1. 强化学习…

C# 零基础入门篇(19.DateTime 使用指南)

## 一、概述 DateTime 是 C# 中用于表示日期和时间的结构&#xff0c;位于 System 命名空间中。它提供了丰富的属性和方法&#xff0c;用于处理日期和时间的创建、格式化、比较和计算。 ## 二、创建 DateTime 对象 ### &#xff08;一&#xff09;使用默认构造函数 DateTime…

Linux环境使用jmeter做性能测试

一、安装JDK&#xff0c;版本jdk1.8 1、下载压缩包到/jdk目录下解压 cd /jdk tar -zxvf jdk-8u241-linux-64.tar.gz 2、配置环境变量 在profile文件中末尾新增信息如下所示 vim /etc/profile export JAVA_HOME/usr/local/java/jdk/jdk1.8.0_221 export PATH$PATH:$JAVA_HOM…

【Linux———线程精讲】

当这世界已经准备将我遗弃&#xff0c;像一个伤兵被留在孤独荒野里.................................................... 文章目录 前言 一、【线程介绍】 1.1、【什么是线程&#xff1f;】 1.2、【重新理解进程】 1.3、【详解页表映射】 1.3.1、【重谈地址空间】 1.3.2、【二…