赞
踩
Problem: 30. 串联所有单词的子串
自己做出来的困难题目,虽然耗时长点,但还是挺有成就感的。
用unordered_map来存word个数,然后遍历s,word单词长度相同,所以直接substr,然后就可以unordered_map - 1就行,若是存在负数,说明unordered_map中没有这个字符串,也就是words中没有这个字符串,所以可以直接break continue。否则检查unordered_map,只要!=0,说明没有匹配完全,少了,也break,全部匹配才通过。
遍历,用unordered_map
时间复杂度:
添加时间复杂度, 示例: O ( n ) O(n) O(n)
空间复杂度:
添加空间复杂度, 示例: O ( n ) O(n) O(n)
#include<unordered_map> class Solution { public: vector<int> findSubstring(string s, vector<string>& words) { vector<int> ret; unordered_map<string, int> ump, cpm; if(s.length() < (words.size() * words[0].length())) return ret; for(int i = 0; i < words.size(); i++) { ump[words[i]]++; } string tg; int k = ump[words[0]]; { if(ump.size()==1) { while(k--) tg += words[0]; words.clear(); words.push_back(tg); } ump.clear(); for(int i = 0; i < words.size(); i++) { ump[words[i]]++; } } int le = words[0].length(); int nw = words.size(); int ns = s.length(); int l = 0, r = ns, mk = 2; string t0; for(int i = 0; i <= ns - le * nw; i++) { cpm = ump; mk = 2; for(int j = 0; j < nw; j++) { t0 = s.substr(i+ le * j, le); if(cpm[t0] > 0) { cpm[t0]--; } else { mk = -2; break; } } if(mk < 0) continue; else { for(auto tk:cpm) { if(tk.second!=0) { mk = -2; break; } } if(mk > 0) ret.push_back(i); } } return ret; } };
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。