• LeetCode No30. 串联所有单词的子串


    给定一个字符串 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"]
    输出:[]

    示例 3:

    输入:s = "barfoofoobarthefoobarman", words = ["bar","foo","the"]
    输出:[6,9,12]

    提示:

    1 <= s.length <= 10^4
    s 由小写英文字母组成
    1 <= words.length <= 5000
    1 <= words[i].length <= 30
    words[i] 由小写英文字母组成

    思路

    首先的想法就是遍历字符串,然后把当前下标i以及之后的n*m[n为words的长度,m为每个单词的长度]个字符拿出来,截取成n个字符,然后和原来的目标数组排完序后作下对比,如果全部相等,则匹配成功。
    后面想想这个排序似乎是可以省掉的,可以直接用map去存,然后判断两个map是否相等即可。

    AC代码

    点击查看代码
    class Solution {
        public List<Integer> findSubstring(String s, String[] words) {
            List<Integer> res = new ArrayList<>();
            int len = s.length();
            int n = words.length;
            if( n==0 || len == 0) {
                return res;
            }
            int m = words[0].length();
            Arrays.sort(words);
            int index = 0;
            while( index+n*m<=len ) {
                String[] strs = new String[n];
                int low = index;
                // System.out.println(index);
                for(int i=0; i<n; i++) {
                    int high = low + m;
                    String str = s.substring(low, high);
                    // System.out.print(str + "      ");
                    low = high;
                    strs[i] = str;
                }
                Arrays.sort(strs);
                boolean flag = true;
                for(int i=0; i<n; i++) {
                    if( !strs[i].equals(words[i])) {
                        flag = false;
                        break;
                    }
                }
                if( flag ) {
                    res.add(index);
                }
                index ++;
            }
            return res;
        }
    }
    
    点击查看代码
    class Solution {
        public List<Integer> findSubstring(String s, String[] words) {
            List<Integer> res = new ArrayList<>();
            int len = s.length();
            int n = words.length;
            if( n==0 || len == 0) {
                return res;
            }
            int m = words[0].length();
            HashMap<String, Integer> wordMap = new HashMap<>();
            for(String word: words) {
                Integer value = wordMap.get(word);
                if( value==null) {
                    value = 0;
                }
                value ++;
                wordMap.put(word, value);
            }
            int index = 0;
            while( index+n*m<=len ) {
                HashMap<String, Integer> zi = new HashMap<>();
                int low = index;
                for(int i=0; i<n; i++) {
                    int high = low + m;
                    String str = s.substring(low, high);
                    low = high;
                    Integer value = zi.get(str);
                    zi.put(str, value==null?1:value+1);
                }
                if( wordMap.equals(zi)) {
                    res.add(index);
                }
                index ++;
            }
            return res;
        }
    }
    
  • 相关阅读:
    不定长内存池之apr_pool
    FFmpeg介绍及参数详细说明
    Linux下ffmpeg安装与开发配置
    基于Live555,ffmpeg的RTSP播放器直播与点播
    ffmpeg开发指南
    boost::bind的使用方法
    开启Linux VNC远程桌面
    Fedora 启动 SSH服务
    Linux中查看进程及杀死进程命令
    __FILE__,__LINE__,FUNCTION__实现代码跟踪调试(linux下c语言编程 )
  • 原文地址:https://www.cnblogs.com/Asimple/p/16205034.html
Copyright © 2020-2023  润新知