Leetcodes Solution 30 Substring with Concatenation of All Words
匯總
雪之下雪乃:leetcode解題總匯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]
.
思路1
解決該問題的關鍵是理解清楚要求。
給定一個目標字元串s,一個單詞集合words。
要求使得words集合中所有元素連續出現在s中的首位置組成的集合(元素順序不考慮)。
正如所給實例,目標字元串s: 「barfoothefoobarman」
對比單詞集合words: [「foo」, 「bar」]
我們發現,在pos=0 ~ 5 時「barfoo」恰好匹配,則0壓入結果vector;
在pos=9 ~ 14 時「foobar」恰好匹配,則9壓入結果vector;
在理清楚題意後,便可入手程序實現。
class Solution{public: vector<int> findSubstring(string s, vector<string>& words){ if(words.empty()) return vector<int>(); vector<int> ret; //每個單詞的長度相同 int word_size = strlen(words[0].c_str()); int word_nums = words.size(); //所給匹配字元串的長度 int s_len = strlen(s.c_str()); //記錄所給words中每個單詞的出現次數 map<string, int> word_count; 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; }else{ break; } } //所有words內的單詞,在i起始位置都出現,則將下標i存入結果的vector中 if(j == word_nums) ret.push_back(i); } return ret; }};
推薦閱讀:
※漫談C指針(1):指針背後的邏輯
※漢語編程,在漢芯事件之後中國軟體界最大的騙局
※編程入門的第一課——建立編程思維
※一種單入口的API框架設計方式(新手向)
※大家都在用 Node.js 幹什麼呢?