30. 与所有单词相关联的字串、java实现

题目描述:

给定一个字符串 s 和一些长度相同的单词 words。在 s 中找出可以恰好串联 words 中所有单词的子串的起始位置。

注意子串要与 words 中的单词完全匹配,中间不能有其他字符,但不需要考虑 words 中单词串联的顺序。

示例 1:
输入:
 s = "barfoothefoobarman",
 words = ["foo","bar"]
输出:
  [0,9]

解释: 从索引 0 和 9 开始的子串分别是 "barfoor" 和 "foobar" 。
输出的顺序不重要, [9,0] 也是有效答案。

示例 2:
输入:
 s = "wordgoodstudentgoodword",
 words = ["word","student"]

输出:
 []

滑动窗口法:

    // 参考博客:
    // http://www.cnblogs.com/migoo/p/9454684.html
    // 用了滑动窗口的方法
    public List<Integer> findSubstring(String s, String[] words) {
        List<Integer> result = new ArrayList<Integer>();
        // 如果s,或者是words为空,那么也返回一个空的列表
        if (s.length() == 0 || s == null || words.length == 0 || words == null){
            return result;
        }
        int size = words[0].length(), length = words.length;

        // 把字符串数组中的的字符串全部插入HashMap中
        HashMap<String, Integer> map = generate(words);
        // 窗口的不同的起点,有size个不同的起点
        for (int i = 0; i < size; i++){
            HashMap<String, Integer> window= new HashMap<>();  // 一个滑动的窗口
            int left,right;
            left = right = i;
            while (right <= s.length() - size && left <= s.length() - length * size){
                String word = s.substring(right, right + size);
                incr(window, word);
                if (!map.containsKey(word)){
                    window.clear();
                    right += size;
                    left = right;
                    continue;
                }
                while (window.get(word) > map.get(word)){
                    String w = s.substring(left, left + size);
                    decr(window, w);
                    left += size;
                }
                right += size;
                if (right - left == size * length){
                    result.add(left);
                }
            }
        }
        return result;
    }
    private HashMap<String, Integer> generate(String[] strs){
        HashMap<String, Integer> map = new HashMap<>();
        for (String str : strs){
            incr(map, str);
        }
        return map;
    }

    private void incr(HashMap<String, Integer> map, String str) {
        map.put(str, map.getOrDefault(str,0) + 1);
    }
    private void decr(HashMap<String, Integer> map, String str) {
        Integer num = map.get(str);
        if (num <= 1){
            map.remove(str);
        }else {
            map.put(str, num - 1);
        }
    }

暴力法:

    // 参考博客
    // https://www.nowcoder.com/discuss/87526?type=0&order=0&pos=11&page=0
    // 暴力法
    public List<Integer> findSubstring(String s, String[] words) {
        List<Integer> result = new ArrayList<Integer>();
        if (s.length() == 0 || s == null || words.length == 0 || words == null){
            return result;
        }
        int size = words[0].length();
        int length = words.length;
        // 截取字符串时,取左不取右,所以这里的for循环中i的最大值可以取等号
        for (int i = 0; i <= s.length() - size * length; i++){
            HashMap<String, Integer> map = new HashMap<>();
            for (String word : words){
                map.put(word, map.getOrDefault(word, 0) + 1);
            }
            if (check(s,i,map,size)){
                result.add(i);
            }
        }
        return result;
    }

    private boolean check(String s, int i, HashMap<String, Integer> map, int size) {
        if (map.size() == 0){
            return true;
        }
        if (i > s.length() || i + size > s.length()){
            return false;
        }
        String word = s.substring(i, i + size);
        if (!map.containsKey(word)){
            return false;
        }else {
            Integer num = map.get(word);
            if (num <= 1){
                map.remove(word);
            }else {
                map.put(word, num - 1);
            }

           return check(s, i + size, map, size);
        }
    }

原文地址:https://www.cnblogs.com/daleyzou/p/9478836.html

时间: 2024-11-09 10:48:11

30. 与所有单词相关联的字串、java实现的相关文章

[leetcode] 30. 与所有单词相关联的字串(cn第653位做出此题的人~)

30. 与所有单词相关联的字串 这个题做了大概两个小时左右把...严重怀疑leetcode的judge机器有问题.同样的代码交出来不同的运行时长,能不能A题还得看运气? 大致思路是,给words生成一关于s的字典,用来记录每个word在s中出现的所有位置,注意可能会出现相同的word.然后递归枚举words的排列情况,一一校验是否符合条件(即连在一起).用到了递归+记忆化搜索+kmp+几个剪枝 一直最后几个测试用例上TLE,囧啊,甚至一度怀疑是不是还有更优的做法. 然后开始考虑剪枝: 记忆化搜索

Leetcode——30.与所有单词相关联的字串【##】

@author: ZZQ @software: PyCharm @file: leetcode30_findSubstring.py @time: 2018/11/20 19:14 题目要求: 给定一个字符串 s 和一些长度相同的单词 words.在 s 中找出可以恰好串联 words 中所有单词的子串的起始位置. 注意子串要与 words 中的单词完全匹配,中间不能有其他字符,但不需要考虑 words 中单词串联的顺序. 示例 1: 输入: s = "barfoothefoobarman&qu

[Swift]LeetCode30. 与所有单词相关联的字串 | 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. Example 1: Input

01字串--java

题目如下: 解法一:简单.讨巧了 1 class test 2 { 3 public static void main(String[] args) 4 { 5 int a,b,c,d,e; 6 7 for(a=0;a<=1;a++) 8 for(b=0;b<=1;b++) 9 for(c=0;c<=1;c++) 10 for(d=0;d<=1;d++) 11 for(e=0;e<=1;e++) 12 System.out.printf("%d%d%d%d%d\n&

表单标签&lt;label&gt;----------------------用for属性 和radio 的id相关联 可以让鼠标点字就相当于点击radio

定义和用法 <label> 标签为 input 元素定义标注(标记). label 元素不会向用户呈现任何特殊效果.不过,它为鼠标用户改进了可用性.如果您在 label 元素内点击文本,就会触发此控件.就是说,当用户选择该标签时,浏览器就会自动将焦点转到和标签相关的表单控件上. <label> 标签的 for 属性应当与相关元素的 id 属性相同. <form><label for="male">Male</label><

创建Hive/hbase相关联的表异常

hive> CREATE TABLE hperson(id string, name string,email string) STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler' WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":id,cf1:name,cf2:email") TBLPROPERTIES ("hbase.table.

Entity Framework 6 Recipes 2nd Edition(12-5)译 -&gt; 自动删除相关联实体

12-5. 自动删除相关联实体 问题 当一个实体被删除时,你想自动删除它相关联的实体 解决方案 假设你有一个表结构由一个course (科目), course 的classes (课程),以及enrollment (登记学生选课),如 Figure 12-5所示:. Figure 12-5. The Course, Class, and Enrollment tables in our database 由上述表生成一个模型,如下图Figure 12-6所示:. Figure 12-6. A m

已有打开的与此 Command 相关联的 DataReader,必须首先将它关闭。

多次用到SqlDataReader 要先关闭,再执行ExecuteNonQuery操作 每用一次需要先进行关闭,再执行新的一次,要不然就会报错“已有打开的与此 Command 相关联的 DataReader,必须首先将它关闭.” 那么如何解决呢? 方法有两种1,在ConnectionString加上MultipleActiveResultSets=true,但只适用于SQL 2005以后的版本2.选择读出SqlDataReader 中的数据给List或者arraylist之类的,之后进行关闭返回

Asp.Net WebApi 集成OWIN架构后,出现 “没有 OWIN 身份验证管理器与此请求相关联” 的解决办法

在Asp.Net WebApi 项目中开启OWIN模块之后,如果没有在OWIN的Startup类中配置认证方式,调用WebApi的相关Controller和Action就会出现如下异常: 出现错误. 没有 OWIN 身份验证管理器与此请求相关联. ExceptionType:System.InvalidOperationException StackTrace: 在 System.Web.Http.Owin.PassiveAuthenticationMessageHandler.Suppress