zoukankan      html  css  js  c++  java
  • LeetCode(30) 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.

    For example, given:
    s: “barfoothefoobarman”
    words: [“foo”, “bar”]

    You should return the indices: [0,9].
    (order does not matter).

    分析

    解决该问题的关键是理解清楚要求。
    给定一个目标字符串s,一个单词集合words。
    要求使得words集合中全部元素连续出如今s中的首位置组成的集合(元素顺序不考虑)。

    正如所给实例,目标字符串s: “barfoothefoobarman”
    对照单词集合words: [“foo”, “bar”]
    我们发现,在pos=0 ~ 5时“barfoo”恰好匹配,则0压入结果vector。
    在pos=9 ~ 14时“foobar”恰好匹配。则9压入结果vector。

    在理清楚题意后,便可入手程序实现。

    AC代码

    class Solution {
    public:
        vector<int> findSubstring(string s, vector<string>& words) {
            if (words.empty())
                return vector<int>();
    
            vector<int> ret;
            //记录所给words中每一个单词的出现次数
            map<string, int> word_count;
    
    
            //每一个单词的长度同样
            int word_size = strlen(words[0].c_str());
            int word_nums = words.size();
            //所给匹配字符串的长度
            int s_len = strlen(s.c_str());
    
            for (int i = 0; i < word_nums; i++)
                ++word_count[words[i]];
    
            int i, j;
            map<string, int> temp_count;
            for (i = 0; i < s_len - word_nums*word_size + 1; ++i)
            {
                temp_count.clear();
                for (j = 0; j < word_nums; j++)
                {
                    //检验当前单词是否属于words以及出现的次数是否一致
                    string word = s.substr(i + j*word_size, word_size);
                    if (word_count.find(word) != word_count.end())
                    {
                        ++temp_count[word];
                        //假设出现的次数与words不一致,则返回错误
                        if (temp_count[word] > word_count[word])
                            break;
                    }//if
                    else{
                        break;
                    }//else                 
                }//for
                //全部words内的单词,在i起始位置都出现,则将下标i存入结果的vector中
                if (j == word_nums)
                {
                    ret.push_back(i);
                }//if
            }//for
            return ret;
        }
    };

    GitHub測试程序源代码

  • 相关阅读:
    linux常用脚本
    shell学习笔记
    Linux常用命令List
    Centos7部署Zabbix
    centos7安装nagios步骤
    nagios报错HTTP WARNING: HTTP/1.1 403 Forbidden解决方法
    U盘安装CentOS7
    Thread线程控制之sleep、join、setDaemon方法的用处
    EfficientDet框架详解 | 目前最高最快最小模型,可扩缩且高效的目标检测(附源码下载)
    ubuntu18.04 安装多版本cuda ,原来版本为9.0,在新增8.0
  • 原文地址:https://www.cnblogs.com/gccbuaa/p/7112652.html
Copyright © 2011-2022 走看看