LeetCode30-与所有单词相关联的字符串

题目:给定一个字符串s和一些长度相同的单词words。在s中找出可以恰好串联words中所有单词的子串的起始位置。
思路一:从字符串s的0位起,遍历以i为起始字符位置、word长度的字符串。如果子串连续命中words.size()次,则将i放入结果列表中。
评价:这种暴力模式,beats约6%。

代码如下:

class Solution {
public:
    vector<int> findSubstring(string s, vector<string>& words) {
        vector<int> result;
        if(s.empty() || words.empty()) return result;
        int sLen=s.size();
        int wordLen=words[0].size();
        int wordsLen=words.size()*wordLen;
        int pos=0;
        while(pos<=sLen-wordsLen){
            int temPos=pos;
            vector<bool> mark(words.size(),true);
            int i=0;
            for(;i<words.size();i++){
                string curWord=s.substr(temPos,wordLen);
                int wordPos=findWord(words,curWord,mark);
                if(wordPos==words.size()){
                    pos++;
                    break;
                }
                mark[wordPos]=false;
                temPos+=wordLen;                    
            }
            if(i==words.size()){
                result.push_back(pos);
                pos++;
            }
        }
        return result;
    }
private:
    int findWord(vector<string> &words,string word,vector<bool>& mark){
        int i=0;
        while(i<words.size()){
            if(words[i]==word  && mark[i])
                return i;
            i++;
        }
        return i;
    }
};

思路二:
每个字符串有三种可能:
1.是words中的字符串元素,对应的map中可用个数>0
2.是words中的字符串元素,对应的map中的可用个数=0
3.不是words中的字符串元素

代码如下:

    class Solution {
    public:
        vector<int> findSubstring(string s, vector<string>& words) {
            vector<int> result;
            if (s.empty() || words.empty()) return result;
            int sLen = s.size();
            int wordLen = words[0].size();
            int wordsLen = words.size()*wordLen;
            map<string, int> wordsMap;
            initialWords(words, wordsMap);
            for (int beginPos = 0; beginPos<wordLen; beginPos++){
            int pos = beginPos;
            deque<string> targetWord;
            map<string, int> copyMap(wordsMap);
            while (pos <= (sLen - wordsLen + wordLen * targetWord.size())){
                string curWord = s.substr(pos, wordLen);
                if (copyMap.find(curWord) != copyMap.end()){
                    if (copyMap[curWord]>0){
                        copyMap[curWord]--;
                        targetWord.push_back(curWord);
                    }
                    else{
                        //reInitaial(copyMap,wordsMap);
                        string dequeWord = *(targetWord.begin());
                        while (dequeWord != curWord){
                            targetWord.pop_front();
                            copyMap[dequeWord]++;
                            dequeWord = *(targetWord.begin());
                        }
                        targetWord.pop_front();
                        targetWord.push_back(curWord);
                    }
                    if (targetWord.size() == words.size())
                        result.push_back(pos - wordsLen + wordLen);
                }
                else{
                    reInitial(copyMap, wordsMap);
                    targetWord.clear();
                }
                pos += wordLen;
            }
        }
        return result;
    }
private:
    void reInitial(map<string, int> &copyMap, map<string, int> &wordsMap){
        for (auto iter1 = copyMap.begin(), iter2 = wordsMap.begin(); iter1 != copyMap.end(); iter1++, iter2++)
            iter1->second = iter2->second;
    }
    void initialWords(vector<string> &words, map<string, int> & wordsMap){
        for (auto iter = words.begin(); iter != words.end(); iter++){
            wordsMap[*iter]++;
        }
    }
};
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,053评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,527评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,779评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,685评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,699评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,609评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,989评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,654评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,890评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,634评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,716评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,394评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,976评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,950评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,191评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,849评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,458评论 2 342

推荐阅读更多精彩内容

  • 官网 中文版本 好的网站 Content-type: text/htmlBASH Section: User ...
    不排版阅读 4,362评论 0 5
  • 如果人类适应了三维,去掉一个维度,进入了二维世界,那么人类就会因为缺少了原来所适应的一个维度,而无法生存。 ...
    罗罗攀阅读 2,695评论 1 16
  • 最近看了一部电影叫《摆渡人》,让我很感动,这么多天过去了,我还是会想起那句“时间一直走,没有尽头,只有路口”。看见...
    一切的一阅读 172评论 0 0
  • 回归测试 回归之前的bug,再跟踪线上数据,没有问题,这个需求完美结束 集成测试 由于部分功能前端还有冲突...
    喵喵喵喵苗啊阅读 130评论 1 0
  • ​练好以下5种动作,让你的肩膀肌肉得到质的飞跃。 问题 如果每天都在健身房努力的锻炼肩膀,但是没有任何效果,这对每...
    f69b661ee123阅读 1,595评论 3 18