John Will的博客

一个人的独白。

Substring with Concatenation of All Words

题目描述

You are given a string, S, and a list of words, L, that are all of the same length. Find all starting indices of substring(s) in S that is a concatenation of each word in L exactly once and without any intervening characters.

For example, given:
S:"barfoothefoobarman"
L:["foo", "bar"]

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

题意:

给一个字符串 S 和一个单词列表,单词长度都一样,找出所有 S 的子串,子串由所有单词组成,返回子串的起始位置。

分析:

很明显每个子串都是由所有单词组成的,长度是一定的,所以直接枚举子串,切分后再用 map 进行判断就行了。

实现代码:

             class Solution {
public:
    vector<int> findSubstring(string S, vector<string> &L) {
        map<string, int> words;  
        map<string, int> curWords;  
        vector<int> ret;  
        int slen = S.length();  
        if (!slen || L.empty()) return ret;  
        int llen = L.size(), wlen = L[0].length();  
        for(int i=0;i<L.size();i++)  
//计算字符串对应的key值
            ++words[L[i]];   
        // check the [llen * wlen] substring  
        for (int i = 0; i + llen * wlen <= slen; i++) 
        {  
            curWords.clear();  
            int j = 0;  
            // check the words  
            for (j = 0; j < llen; j++) 
            {  
                string tmp = S.substr(i + j * wlen, wlen);  
                if (words.find(tmp) == words.end())  
                    break;  
                ++curWords[tmp];  
                if (curWords[tmp] > words[tmp])  //防止S中重复单词出现
                    break;  
            }  
            if (j == llen)  //从i位置已经找到了L中的单词;
                ret.push_back(i);  
        }  
        return ret;  
    }
};

阅读更多
个人分类: Map 字符串
上一篇Next Permutation寻找下一个全排列
下一篇Divide Two Integers
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭