438. Find All Anagrams in a String

2018/04/13 leetcode 共 1120 字,约 4 分钟

Title

the problem link

Given a string s and a non-empty string p, find all the start indices of p’s anagrams in s.

Strings consists of lowercase English letters only and the length of both strings s and p will not be larger than 20,100.

The order of output does not matter.

Example 1:

Input:
s: "cbaebabacd" p: "abc"

Output:
[0, 6]

Explanation:
The substring with start index = 0 is "cba", which is an anagram of "abc".
The substring with start index = 6 is "bac", which is an anagram of "abc".
Example 2:

Input:
s: "abab" p: "ab"

Output:
[0, 1, 2]

Explanation:
The substring with start index = 0 is "ab", which is an anagram of "ab".
The substring with start index = 1 is "ba", which is an anagram of "ab".
The substring with start index = 2 is "ab", which is an anagram of "ab".

题目大意:就是返回所有的可以组成变位置序列的index

这个明显滑动窗口,但不能用map,用的vector,vector比较运算可以直接做,否则map一一比较就扩大复杂度了

Solution

//cpp:
class Solution {
public:
	vector<int> findAnagrams(string s, string p) {
		vector<int> sv(256, 0), pv(256, 0), res;
		if (p.size() > s.size()) {
			return res;
		}
		for (int i = 0; i < p.size(); i++) {
			sv[s[i]]++;
			pv[p[i]]++;
		}
		if (pv == sv)
			res.push_back(0);
		for (int i = p.size(); i < s.size(); i++) {
			sv[s[i]]++;
			sv[s[i - p.size()]]--;
			if (pv == sv)
				res.push_back(i-p.size()+1);
		}
		return res;
	}
};

Search

    Table of Contents