演算法百題之五十九 串聯所有單詞的子串

2021-10-17 03:07:52 字數 2052 閱讀 7167

很高興又能和大家見面了,接下來準備系列更新的是演算法題,一日一練,早日公升仙!

今天的問題是:串聯所有單詞的子串

示例:

輸入:

s = "barfoothefoobarman",

words = ["foo","bar"]

輸出:[0,9]

解釋:從索引 0 和 9 開始的子串分別是 "barfoo" 和 "foobar" 。

輸出的順序不重要, [9,0] 也是有效答案。

輸入:s = "wordgoodgoodgoodbestword",

words = ["word","good","best","word"]

輸出:

思路:最直接的思路,判斷每個子串是否符合,符合就把下標儲存起來,最後返回即可。

然後我們要做的事情就可以分成兩個:其一是如何拆分出各個子串,其二是如何判斷是否符合。我們先講第乙個,從字串s中拆分出子串,我們只需要得到words中的字串拼接起來的目標字串長度strlength,然後利用string的函式string.strsub(起始位置i,字串長度strlength)就可以了。第二個問題比較難解決,就是怎麼判斷出子串是否就是我們想要的

判斷是否自己想要的子串:

由於子串包含的單詞順序並不需要固定,如果是兩個單詞 a,b,我們只需要判斷子串是否是 ab 或者 ba 即可。如果是三個單詞 a,b,c 也還好,只需要判斷子串是否是 abc,或者 acb,bac,bca,cab,cba 就可以了,但如果更多單詞呢?那就崩潰了。

用兩個 hashmap 來解決。首先,我們把所有的單詞存到 hashmap 裡,key 直接存單詞,value 存單詞出現的個數(因為給出的單詞可能會有重複的,所以可能是 1 或 2 或者其他)。然後掃瞄子串的單詞,如果當前掃瞄的單詞在之前的 hashmap 中,就把該單詞存到新的 hashmap 中,並判斷新的 hashmap 中該單詞的 value 是不是大於之前的 hashmap 該單詞的 value ,如果大了,就代表該子串不是我們要找的,接著判斷下乙個子串就可以了。如果不大於,那麼我們接著判斷下乙個單詞的情況。子串掃瞄結束,如果子串的全部單詞都符合,那麼該子串就是我們找的其中乙個。

演算法**:

vectorfindsubstring(string s, vector& words) 

int wordlength = words[0].length();

int strlength = 0;

int wordnum = words.size();

mapm1;

for (int i = 0; i < wordnum; i++)

if (s.length() < strlength)

mapm2;

string curstr;

for (int i = 0; i <= s.length() - strlength; i++)

m2[word]++;

if (m2[word] > m1[word])

if (curstr.length() == wordlength)

else

} m2.clear();

} return ret;

}

要注意一開始輸入的就是不合法的情況,考慮程式的健壯性。比如目標字串比字串s還長,那就直接返回。測試結果:

演算法題 串聯所有單詞的子串

給定乙個字串 s 和一些長度相同的單詞 words。找出 s 中恰好可以由 words 中所有單詞串聯形成的子串的起始位置。注意子串要與 words 中的單詞完全匹配,中間不能有其他字元,但不需要考慮 words 中單詞串聯的順序。示例 1 輸入 s barfoothefoobarman words...

演算法 串聯所有單詞的子串

給定乙個字串 s 和一些長度相同的單詞 words。找出 s 中恰好可以由 words 中所有單詞串聯形成的子串的起始位置。注意子串要與 words 中的單詞完全匹配,中間不能有其他字元,但不需要考慮 words 中單詞串聯的順序。示例 1 輸入 s barfoothefoobarman words...

LeetCode之串聯所有單詞的子串 30

給定乙個字串 s 和一些長度相同的單詞 words。找出 s 中恰好可以由 words 中所有單詞串聯形成的子串的起始位置。注意子串要與 words 中的單詞完全匹配,中間不能有其他字元,但不需要考慮 words 中單詞串聯的順序。示例 1 輸入 s barfoothefoobarman words...