首页 > 其他分享 >30.substring-with-concatenation-of-all-words 串联所有单词串

30.substring-with-concatenation-of-all-words 串联所有单词串

时间:2022-12-06 19:44:24浏览次数:63  
标签:word int 30 concatenation len substring mp words size

问题描述

30.串联所有单词串

解题思路

首先,由于words中所有字符串长度相同,要比较wordss:
- si = 0开始,可以划分为一系列的长为word_len = words[0].size()的单词;
- si = 1开始,可以划分为一系列的长为word_len = words[0].size()的单词;
- ......
- si = word_len - 1开始......

然后要注意利用unordered_map<string, int>判断是否满足条件的细节,mp用于判断word是否在words中;

mp_tmp的键值对中,如果值为0,就删掉该键;

还要注意l的处理,分为在mp_tmp为空,和mp_tmp不为空,但是word已经出现了超过words中的次数.

代码

class Solution {
  public:
    vector<int> findSubstring(string s, vector<string> &words) {
        unordered_map<string, int> mp;
        int word_len = words[0].size();
        int cnt = 0;
        vector<int> res;
        for (int i = 0; i < words.size(); i++) {
            mp[words[i]]++;
            cnt++;
        }
        if (cnt * word_len > s.size())
            return res;
        // i : [0, word_len - 1], 对每一个i组成的单词序列,都单独使用滑动窗口法判断
        for (int i = 0; i < word_len; i++) {
            int l = i;
            unordered_map<string, int> mp_tmp = mp;
            // unordered_map<string, int> mp_tmp2 = mp;
            for (int r = i; r <= s.size() - word_len; r += word_len) {
                string tmp = s.substr(r, word_len);
                // 单词在words中
                if (mp_tmp.find(tmp) != mp_tmp.end()) {
                    mp_tmp[tmp]--;
                    // 说明出现了超过words里单词的数量
                    if (mp_tmp[tmp] == 0)
                        mp_tmp.erase(tmp);
                    if (mp_tmp.empty()) {
                        res.push_back(l); // 说明找到了目标
                        // mp_tmp = mp; // map变成新的
                        mp_tmp[s.substr(l, word_len)]++;
                        l += word_len;
                    }

                } else {
                    if (mp.find(tmp) == mp.end()) { // 说明这个单词不在words里面
                        l = r + word_len;
                        mp_tmp = mp;
                    } else { // word出现次数超过words中对应单词的次数了,在mp中而不在mp_tmp中
                        string str_l = s.substr(l, word_len);
                        while (str_l != tmp) {
                            mp_tmp[str_l]++;
                            l += word_len;
                            str_l = s.substr(l, word_len);
                        }
                        l += word_len;
                    }
                }
            }
        }
        return res;
    }
};

标签:word,int,30,concatenation,len,substring,mp,words,size
From: https://www.cnblogs.com/zwyyy456/p/16960305.html

相关文章

  • hdu1300 Pearls--DP
    原题链接:​​http://acm.hdu.edu.cn/showproblem.php?pid=1300​​一:原题内容ProblemDescriptionInPearlaniaeverybodyisfondofpearls.Onecompany,calle......
  • hdu3078 Network--RMQ & LCA
    原题链接:​​http://acm.hdu.edu.cn/showproblem.php?pid=3078​​题意:给定n个点标号1到n,每个点一个权值,接下来n-1行u,v表示u和v两点连线,接下来k行查询,op,u,v,如果u为0,表示把点u......
  • 300013 开间和进深
    <?phpheader('Content-Type:text/html;charset=utf-8');define('ROOT',$_SERVER['DOCUMENT_ROOT']);includeROOT.'/assets/php/head.php';$tit='开间和进深';/......
  • 300011 绝对标高和相对标高
    <?phpheader('Content-Type:text/html;charset=utf-8');define('ROOT',$_SERVER['DOCUMENT_ROOT']);includeROOT.'/assets/php/head.php';$tit='绝对标高和相对......
  • MBR30100CT-ASEMI插件肖特基二极管MBR30100CT
    编辑:llMBR30100CT-ASEMI插件肖特基二极管MBR30100CT型号:MBR30100CT品牌:ASEMI封装:TO-220AB特性:插件肖特基二极管正向电流:30A反向耐压:100V恢复时间:5ns引脚数量:3芯......
  • 300010 原位标注和集中标注的区别
    <?phpheader('Content-Type:text/html;charset=utf-8');define('ROOT',$_SERVER['DOCUMENT_ROOT']);includeROOT.'/assets/php/head.php';$tit='原位标注和集中......
  • 300009 板钢筋易错点
    <?phpheader('Content-Type:text/html;charset=utf-8');define('ROOT',$_SERVER['DOCUMENT_ROOT']);includeROOT.'/assets/php/head.php';$tit='板钢筋易错点';......
  • 300008 混凝土保护层厚度
    <?phpheader('Content-Type:text/html;charset=utf-8');define('ROOT',$_SERVER['DOCUMENT_ROOT']);includeROOT.'/assets/php/head.php';$tit='混凝土保护层厚......
  • 300007 混凝土强度等级及选用范围
    <?phpheader('Content-Type:text/html;charset=utf-8');define('ROOT',$_SERVER['DOCUMENT_ROOT']);includeROOT.'/assets/php/head.php';$tit='混凝土强度等级......
  • 300006 建筑工程施工图的识图知识
    <?phpheader('Content-Type:text/html;charset=utf-8');define('ROOT',$_SERVER['DOCUMENT_ROOT']);includeROOT.'/assets/php/head.php';$tit='建筑工程施工图......