Leetcodes Solution 30 Substring with Concatenation of All Words

匯總

雪之下雪乃:leetcode解題總匯?

zhuanlan.zhihu.com圖標

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).

思路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 幹什麼呢?

TAG:演算法 | 數據結構 | 編程 |