日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

LeetCode 30. 串联所有单词的子串(字符串哈希)

發布時間:2024/7/5 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 LeetCode 30. 串联所有单词的子串(字符串哈希) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1. 題目

給定一個字符串 s 和一些長度相同的單詞 words。找出 s 中恰好可以由 words 中所有單詞串聯形成的子串的起始位置。

注意子串要與 words 中的單詞完全匹配,中間不能有其他字符,但不需要考慮 words 中單詞串聯的順序。

示例 1: 輸入:s = "barfoothefoobarman",words = ["foo","bar"] 輸出:[0,9] 解釋: 從索引 09 開始的子串分別是 "barfoo""foobar" 。 輸出的順序不重要, [9,0] 也是有效答案。示例 2: 輸入:s = "wordgoodgoodgoodbestword",words = ["word","good","best","word"] 輸出:[]

來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/substring-with-concatenation-of-all-words
著作權歸領扣網絡所有。商業轉載請聯系官方授權,非商業轉載請注明出處。

2. 解題

類似題目: POJ 3461 字符串匹配(KMP / 哈希(有推導))

  • 將字符串轉換成128進制的數字
typedef unsigned long long ull; class Solution { public:vector<int> findSubstring(string s, vector<string>& words) {if(words.empty() || words.size()*words[0].size() > s.size()) return {};int i, j, wlen = words[0].size(), n = words.size();unordered_map<ull,int> m;for(auto& w : words){ull v = 0;for(char ch : w)v = v*128+ch;m[v]++;//字符轉成128進制的數,計數}//字符串s每個位置開始后的wlen個字符的ull表示vector<ull> hashv(s.size(),0);ull pown = 1;for(i = 0; i < wlen; ++i){pown *= 128;hashv[0] = hashv[0]*128+s[i];}for(i = 1; i <= s.size()-wlen; ++i){hashv[i] = hashv[i-1]*128-s[i-1]*pown+s[i+wlen-1];}vector<int> ans;bool ok;for(i = 0; i <= s.size()-n*wlen; ++i){unordered_map<ull, int> temp(m);ok = true;for(j = i; j < n*wlen+i; j+=wlen){if(--temp[hashv[j]] < 0){ok = false;break;}}if(ok) ans.push_back(i);}return ans;} };

584 ms 126.6 MB

總結

以上是生活随笔為你收集整理的LeetCode 30. 串联所有单词的子串(字符串哈希)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。