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

题目:

给定一个字符串 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"

输出:\[\]

思路

简单的动态规划。

后面再补充讲解。

代码:

java 复制代码
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~

相关推荐
鹿角片ljp27 分钟前
LeetCode 46. 全排列|吃透回溯
算法·leetcode·职场和发展
鼎艺创新科技40 分钟前
不依赖 UE/Unity:我们如何从零搭建一套国产三维 GIS 渲染引擎
人工智能·算法·unity·游戏引擎·三维电子沙盘
Rain的Java大神之路1 小时前
介绍一下分布式事务
java·分布式·后端·spring·spring cloud·架构·springcloud
程序员三藏1 小时前
Python+requests实现接口自动化测试
自动化测试·软件测试·python·测试工具·职场和发展·测试用例·接口测试
吴声子夜歌1 小时前
Java面试题——基础(一)
java·开发语言
别动我齐刘海2 小时前
机器人运动控制学习2——基础进阶
c++·人工智能·神经网络·学习·目标检测·机器学习·机器人
南城以南溫暖如初1472 小时前
外卖CPS实战指南:从技术选型到运营落地全流程解析
java·spring boot·mysql·架构·vue
傻啦嘿哟2 小时前
英雄联盟皮肤爬虫:爬取全皮肤价格与特效,做比价工具
java·c++·爬虫
.道阻且长.3 小时前
11.LeetCode算法习题讲解--滑动窗口--将x减到0的最小操作数
算法·leetcode·职场和发展
码匠许师傅3 小时前
【C++ 面试真题】24. 聊聊 C++ 的时间日期处理
java·c++·面试