留电话的广告网站,网站建设必须注意的事项,自己如何建设个网站,如何开科技1. 题目
给定一个字符串 s 和一些长度相同的单词 words。找出 s 中恰好可以由 words 中所有单词串联形成的子串的起始位置。
注意子串要与 words 中的单词完全匹配#xff0c;中间不能有其他字符#xff0c;但不需要考虑 words 中单词串联的顺序。
示例 1#xff1a;
输入…1. 题目
给定一个字符串 s 和一些长度相同的单词 words。找出 s 中恰好可以由 words 中所有单词串联形成的子串的起始位置。
注意子串要与 words 中的单词完全匹配中间不能有其他字符但不需要考虑 words 中单词串联的顺序。
示例 1
输入s barfoothefoobarman,words [foo,bar]
输出[0,9]
解释
从索引 0 和 9 开始的子串分别是 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:vectorint findSubstring(string s, vectorstring words) {if(words.empty() || words.size()*words[0].size() s.size()) return {};int i, j, wlen words[0].size(), n words.size();unordered_mapull,int m;for(auto w : words){ull v 0;for(char ch : w)v v*128ch;m[v];//字符转成128进制的数计数}//字符串s每个位置开始后的wlen个字符的ull表示vectorull hashv(s.size(),0);ull pown 1;for(i 0; i wlen; i){pown * 128;hashv[0] hashv[0]*128s[i];}for(i 1; i s.size()-wlen; i){hashv[i] hashv[i-1]*128-s[i-1]*powns[iwlen-1];}vectorint ans;bool ok;for(i 0; i s.size()-n*wlen; i){unordered_mapull, int temp(m);ok true;for(j i; j n*wleni; jwlen){if(--temp[hashv[j]] 0){ok false;break;}}if(ok) ans.push_back(i);}return ans;}
};584 ms 126.6 MB