LeetCode热题100 找到字符串中所有字母异位词

题目描述

给定两个字符串 s 和 p,找到 s 中所有 p 的 异位词 的子串,返回这些子串的起始索引。不考虑答案输出的顺序。

示例 1:

输入: s = "cbaebabacd", p = "abc"
输出: 0,6
解释:

起始索引等于 0 的子串是 "cba", 它是 "abc" 的异位词。

起始索引等于 6 的子串是 "bac", 它是 "abc" 的异位词。

示例 2:

输入: s = "abab", p = "ab"
输出: 0,1,2
解释:

起始索引等于 0 的子串是 "ab", 它是 "ab" 的异位词。

起始索引等于 1 的子串是 "ba", 它是 "ab" 的异位词。

起始索引等于 2 的子串是 "ab", 它是 "ab" 的异位词。

提示:

1<=s.length,p.length<=3∗1041 <= s.length, p.length <= 3 * 10^41<=s.length,p.length<=3∗104

s 和 p 仅包含小写字母

思路

1 特殊判断 ,如果s的长度小于p的长度,直接返回空。

2 计算p中每个字符的数量 。

3 s用滑动窗口 ,每次向右滑动一格 ,并获取这个窗口中每个字符的个数,如果和p的字符个数答案相同,记录下来即可。

4 每次判断是否相等只需要判断26个字符数量,时间复杂度为o(n * 26)。

代码

cpp 复制代码
class Solution {
public:
    vector<int> findAnagrams(string s, string p) {
    	int slen = s.size(), plen = p.size();
		// 特殊情况处理 
    	if(slen < plen) return vector<int>();
		// ans存储答案 
		vector<int>ans;
		// num记录p, s中每个字符的个数 
    	vector<int>nump(26, 0);
    	vector<int>nums(26, 0);
		// 统计p中每个字符的个数, 同时记录s的前p.len个 
		for(int i = 0; i < plen; ++i)
		{
			++nump[p[i] - 'a'];
			++nums[s[i] - 'a'];
		}    	
		// 第一组相同先记录下 
		if(nump == nums)
		{
			ans.push_back(0);
		}
		// 每次向右滑动一次, 对比是否相同 
		for(int i = plen; i < slen; ++i)
		{
			++nums[s[i] - 'a'];
			--nums[s[i - plen] - 'a'];
			if(nump == nums)
			{
				ans.push_back(i - plen + 1);
			}
		}
		return ans; 
    }
};
相关推荐
海上小飞龙2 小时前
【KMP算法-下篇】同一道题:Java 库函数 2600 微秒,手写 KMP 16 微秒
java·开发语言·算法
青少儿编程课堂3 小时前
后缀自动机解析:本质不同子串与最长重复片段统计
c++·python·算法·bfs·信息学竞赛
朝朝辞暮i3 小时前
C++ 第 12 课:局部变量、作用域、变量生命周期
开发语言·c++·算法
乐迪信息4 小时前
港口船舶逆行怎么管?AI防爆摄像机搭载智能检测算法
大数据·人工智能·深度学习·算法·计算机视觉
Sirens.5 小时前
Java并发锁详解:六类锁策略与 synchronized 底层原理
java·前端·算法
和裕5 小时前
全纸结构重型纸箱能否满足 1 吨以上设备出口熏蒸豁免要求?通关合规性全解析
大数据·运维·网络·人工智能·算法
tangguofeng6 小时前
不带头结点的链队操作集(不含InitFlag)(C语言版)
算法
苏打豆7 小时前
CRISP源码阅读——基于ROS2力矩反馈控制器与速度加速度零空间
c++·线性代数·算法·矩阵·机器人
蛋蛋的就会顺顺的8 小时前
hot100——矩阵
java·数据结构·算法·leetcode·力扣
老歌老听老掉牙8 小时前
麻花钻切屑形态演变的力学机制与临界条件分析
python·算法·钻头