很高興又能和大家見面了,接下來準備系列更新的是演算法題,一日一練,早日公升仙!
今天的問題是:串聯所有單詞的子串
示例:
輸入:思路:最直接的思路,判斷每個子串是否符合,符合就把下標儲存起來,最後返回即可。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...