NC387. 找到字符串中的异位词
描述
示例1
输入:
"cabac","abc"
输出:
[0,2]
示例2
输入:
"ababab","ab"
输出:
[0,1,2,3,4]
C 解法, 执行用时: 4ms, 内存消耗: 444KB, 提交时间: 2022-04-19
int* findWord(char* s, char* p, int* returnSize ) { // write code here int len1 = strlen(s); int len2 = strlen(p); int* res = malloc(sizeof(int) * len1); *returnSize = 0; int hash[26] = {0}; for (int i = 0; i < len2; i++) { hash[p[i] - 'a']--; } int left = 0, right = 0; while (right < len1) { hash[s[right] - 'a']++; while (hash[s[right] - 'a'] > 0) { hash[s[left] - 'a']--; left++; } if (right - left + 1 == len2) { res[(*returnSize)++] = left; } right++; } return res; }
C++ 解法, 执行用时: 4ms, 内存消耗: 516KB, 提交时间: 2022-08-06
class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param s string字符串 * @param p string字符串 * @return int整型vector */ vector<int> findWord(string s, string p) { // write code here int hs[26]={0}; int hp[26]={0}; vector<int> res; for(auto ch:p) { hp[ch-'a']++; } for(int left=0,right=0;right<s.size();right++) { hs[s[right]-'a']++; while(hs[s[right]-'a']>hp[s[right]-'a']) { hs[s[left]-'a']--; left++; } if(right-left+1==p.size()) { res.push_back(left); } } return res; } };
C++ 解法, 执行用时: 4ms, 内存消耗: 520KB, 提交时间: 2022-05-27
class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param s string字符串 * @param p string字符串 * @return int整型vector */ vector<int> findWord(string s, string p) { // write code here int hs[26]={0}; int hp[26]={0}; vector<int> res; for( auto ch:p){ hp[ch-'a']++; } for(int left =0,right=0;right<s.size();right++){ hs[s[right]-'a']++; while(hs[s[right]-'a']>hp[s[right]-'a']){ hs[s[left]-'a']--; left++; } if(right -left+1==p.size()){ res.push_back(left); } } return res; } };
C++ 解法, 执行用时: 4ms, 内存消耗: 520KB, 提交时间: 2022-05-25
class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param s string字符串 * @param p string字符串 * @return int整型vector */ /*解题思路 *利用map来记录字符 *滑动窗口来获取是否匹配 *利用双指针来遍历 */ vector <int>findWord(string s,string p) { //unordered_map<char,int> need,window; //用map存储目标值中各字符出现的次数 unordered_map<int, char>need; for(char c:p) //遍历p所有字符 {need[c]++;} //记录字符和个数 //用map存储窗口中各字符出现的次数,将P数组长度作为滑动窗口的大小 unordered_map<int,char>window; int left=0; int right=0; int valid=0; //用vector来返回字母异位词的起始索引 vector<int>res; //每次窗口移动要把窗口外的那个字符的数量减1,因为他不在窗口内了,每次移动要把新的字符数量进行加1,因为他在窗口内了,移动完毕,我们只要比较窗口内的字符的以及数量是否和P相等即可 while(right<s.size()) { char c=s[right]; right++; //窗口扩大 //进行窗口内数据的一系列更新 if(need.count(c)) //如果是目标值 { window[c]++; //存进字符和它的个数 // if(window[c]==need[c]) //如果window字符\个数都和need相同 {valid++;} //有效值+1 } while(right-left>=p.size()) { if(valid==need.size()) //如果窗口符合条件 res.push_back(left); //把起始索引存进res char d=s[left]; left++; //窗口缩小 if(need.count(d)) { if(window[d]==need[d]) valid--; window[d]--; } } }return res; } };
C++ 解法, 执行用时: 4ms, 内存消耗: 520KB, 提交时间: 2022-05-19
class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param s string字符串 * @param p string字符串 * @return int整型vector */ vector<int> findWord(string s, string p) { int a[26] = {0}; vector<int> ans; int b = 26; for (auto &i : p) { b -= !a[i - 'a']++; } for (int i = 0, j = 0, n = s.size(); i < n; ++i) { b += !--a[s[i] - 'a']; while (a[s[i] - 'a'] < 0) b -= !a[s[j++] - 'a']++; if (b == 26) ans.push_back(j); } return ans; } };