栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

30. 串联所有单词的子串

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

30. 串联所有单词的子串

今天看了下leetcode的第30题,题目链接:30. 串联所有单词的子串
题目如下:

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

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

我这里使用了滑动切割字符串的方式,理解起来相对简单,代码如下;

public static List findSubstring(String s, String[] words) {

        int sLen = s.length();
        int len = words.length;
        int length = words[0].length();

        Map map = new HashMap();
        List list = new ArrayList<>();
        //记录words得个数
        for(String word : words){
            map.put(word,map.getOrDefault(word,0)+1);
        }

        for (int i = 0; i <= sLen -len*length; i++) {
            // 减少比较次数
            if(map.containsKey(s.substring(i,i+length))
                    && map.containsKey(s.substring(i+(len-1)*length,i+len*length))){
                int index = i;
                String tmp = "";
                
                Map tmpMap = new HashMap();
                tmpMap.putAll(map);
                while(index <= i+(len-1)*length){
                    tmp = s.substring(index,index+length);
                    if(tmpMap.containsKey(tmp)){
                        tmpMap.put(tmp,tmpMap.get(tmp)-1);
                        if(tmpMap.get(tmp) == 0){
                            tmpMap.remove(tmp);
                        }
                    }else{
                        break;
                    }
                    if(tmpMap.size() == 0){
                        list.add(i);
                    }
                    index += length;
                }
            }

        }
        return list;

    }
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/991941.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号