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測试程序源代码

时间: 2024-10-27 05:29:02

LeetCode(30) Substring with Concatenation of All Words的相关文章

HTML5移动开发之路(30)—— JavaScript回顾5

本文为 兄弟连IT教育 机构官方 HTML5培训 教程,主要介绍:HTML5移动开发之路(30)-- JavaScript回顾5 一.查找 第一种方式:依据id查找 var obj = document.getElementById(id);   //document是HTMLDocument的实例 [html] view plain copy print? <html> <head> <script> function f1(){ var obj = document

06-5. 关键活动(30) 关键路径 和输出关键路径

06-5. 关键活动(30) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 本实验项目是实验项目6-06的深化.任务调度问题中,如果还给出了完成每个子任务需要的时间,则我们可以算出完成整个工程需要的最短时间.在这些子任务中,有些任务即使推迟几天完成,也不会影响全局的工期:但是有些任务必须准时完成,否则整个项目的工期就要因此延误,这种任务就叫"关键活动". 请编写程序判定一个给定的工程项目的任务调度是否可行:如果该调度方案可行

构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(30)-本地化(多语言)

原文:构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(30)-本地化(多语言) 我们的系统有时要扩展到其他国家,或者地区,需要更多的语言环境,微软提供了一些解决方案,原始我们是用js来控制的,现在不需要了. 我们只要创建简单的资源文件,通过MVC的路由设置就可以轻松的进行语言中的切换. 本节受益于:Asp.net MVC3 高级编程第121页.大家可以自行百度这本书,这应该是国内第一本中文版的MVC3.0教程 现在从项目入手吧(本节也适合其他MVC程序),

python(30)——【random模块】【if __name__ ==&#39;__main__&#39;】【os模块】

一.random模块(随机模块) 1.random 常用模块介绍 import random print(random.random()) #返回[0,1)之间的随机浮点数 print(random.randint(2, 4)) #返回一个[2,4]内的随机整数 print(random.choice([1, [20, 23], 66, 4])) #返回可迭代对象中的任意一个元素 print(random.sample([1, [20, 23], 66, 4], 2)) #返回可迭代对象中的任意

Leetcode(4)寻找两个有序数组的中位数

Leetcode(4)寻找两个有序数组的中位数 [题目表述]: 给定两个大小为 m 和 n 的有序数组 nums1 和* nums2. 请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n)). 你可以假设 nums1* 和 nums2 不会同时为空. 第一种方法:list拼接排列取中位数 执行用时:116 ms : 内存消耗:11.8MB 效果:还行 class Solution(object): def findMedianSortedArrays(self,

Leetcode(5)最长回文子串

Leetcode(4)寻找两个有序数组的中位数 [题目表述]: 给定一个字符串 s,找到 s 中 最长 的回文子串.你可以假设 s 的最大长度为 1000.' 第一种方法:未完成:利用回文子串的特点 一开始我的思路如下:回文子串的特点是首尾字母相同,所以我对每一个字母都找到位于它后面的相同字母,利用切片判断这一段是否为回文子串(str[i:j]==str[i:j][::-1]).时间复杂度很高,主要是因为str.find操作非常耗时. class Solution(object): def lo

Leetcode(1)两数之和

Leetcode(1)两数之和 [题目表述]: 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标.你可以假设每种输入只会对应一个答案.但是,你不能重复利用这个数组中同样的元素. 第一种方法:暴力 执行用时:5352 ms: 内存消耗:12.9MB 效果:非常差 class Solution(object): def twoSum(self, nums, target): """ :type nums:

Leetcode(2)两数相加

Leetcode(2)两数相加 [题目表述]: 给出两个 非空 的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字. 如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和.您可以假设除了数字 0 之外,这两个数都不会以 0 开头. 第一种方法:大众解法 执行用时:80 ms: 内存消耗:12.2MB # Definition for singly-linked list. # class ListNode(object

Leetcode(3)无重复字符的最长子串

Leetcode(3)无重复字符的最长子串 [题目表述]: 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 第一种方法:暴力 执行用时:996 ms: 内存消耗:12.9MB 效果:太差 class Solution(object): def lengthOfLongestSubstring(self, s): """ :type s: str :rtype: int """ Maxsize=0 res='' if len(s)