首页 > 代码库 > LeetCode(30) Substring with Concatenation of All Words

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

<script type="text/javascript"> $(function () { $(‘pre.prettyprint code‘).each(function () { var lines = $(this).text().split(‘\n‘).length; var $numbering = $(‘
    ‘).addClass(‘pre-numbering‘).hide(); $(this).addClass(‘has-numbering‘).parent().append($numbering); for (i = 1; i <= lines; i++) { $numbering.append($(‘
  • ‘).text(i)); }; $numbering.fadeIn(1700); }); }); </script>

LeetCode(30) Substring with Concatenation of All Words