14.【滑动窗口】
14.【滑动窗口】
题目传送门 方法一:滑动窗口算法原理 新建两个哈希表(数组模拟) :通过比较两个哈希表是否一样用来判断是否是异位词
hashS用来统计字符串s的字符出现次数,
hashP用来统计字符串p的字符出现次数,
通过滑动窗口
每当right - left + 1 > 字符串p的长度的时候。此时令 left++并让left-‘a’指向的字符出现次数--
来保证这个窗口大小
14.【滑动窗口】
代码语言:javascript代码运行次数:0运行复制新建两个哈希表(数组模拟) :通过比较两个哈希表是否一样用来判断是否是异位词 hashS用来统计字符串s的字符出现次数, hashP用来统计字符串p的字符出现次数, 通过滑动窗口 每当right - left + 1 > 字符串p的长度的时候。此时令 left++并让left-‘a’指向的字符出现次数-- 来保证这个窗口大小是 <= 字符串p的长度 每当窗口大小等于字符串p的长度,就比较两个hash数组是否一样。若一样,就添加left下标 到ret顺序表中
class Solution {
public List<Integer> findAnagrams(String s0, String p0) {
int[] hashS = new int[26]; //通过比较两个哈希表是否一样用来判断是否是异位词
int[] hashP = new int[26];
char[] s = ();//字符串转数组,方便求解
char[] p = ();
int m = s0.length(),n = p0.length(); //得到两字符串长度
List<Integer> ret = new ArrayList<>();
for (int i = 0; i < n; i++) { //将p字符串扔进拟哈希表p。等待与拟哈希表s进行比较
hashP[p[i] - 'a']++;
}
for (int left = 0,right = 0; right < m; right++) {
hashS[s[right] - 'a']++; //进窗口
if(right - left + 1 > n){ //如果进多了,那么就出窗口。
hashS[s[left++]-'a']--;
}
if ((hashS, hashP)){ //此时窗口大小一定为p数组长度的大小。
ret.add(left); //比较两哈希表是否一致,如果一致,就添加初始索引。
}
}
return ret; //最终返回初始索引数组集
}
}
代码语言:javascript代码运行次数:0运行复制后面自己写出来的
class Solution {
public List<Integer> findAnagrams(String s, String p) {
int[] hashS = new int[26];
int[] hashP = new int[26];
List<Integer> ret = new ArrayList<>();
int m = s.length(),n = p.length();
for(int i = 0; i < n; i++){
hashP[(i)-'a']++;
}
for(int left = 0,right = 0; right < m; right++){
hashS[(right) - 'a']++;
if(right - left + 1 > n){
hashS[(left++) - 'a']--;
}
if((hashS,hashP)){
ret.add(left);
}
}
return ret;
}
}
代码语言:javascript代码运行次数:0运行复制再小小优化一下
class Solution {
public List<Integer> findAnagrams(String s, String p) {
int[] hashS = new int[26];
int[] hashP = new int[26];
List<Integer> ret = new ArrayList<>();
int m = s.length(),n = p.length();
for(int i = 0; i < n; i++){
hashP[(i)-'a']++;
}
for(int left = 0,right = 0; right < m; right++){
hashS[(right) - 'a']++;
if(right - left + 1 > n){
hashS[(left++) - 'a']--;
}if(right - left + 1 == n && (hashS,hashP)){
ret.add(left);
}
}
return ret;
}
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。 原始发表:2025-01-19,如有侵权请联系 cloudcommunity@tencent 删除int数组索引统计字符串时间复杂度:O(m+n) m和n分别是字符串s和p的长度 空间复杂度:O(m) m是字符串s的长度
#感谢您对电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格的认可,转载请说明来源于"电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格
上传时间: 2025-07-21 00:45:19
上一篇:【栈】
下一篇:string的模拟实现
推荐阅读
留言与评论(共有 15 条评论) |
本站网友 重庆骑士医院 | 22分钟前 发表 |
此时令 left++并让left-‘a’指向的字符出现次数-- 来保证这个窗口大小是 <= 字符串p的长度 每当窗口大小等于字符串p的长度 | |
本站网友 怎样快速去除眼袋 | 20分钟前 发表 |
分享自作者个人站点/博客 | |
本站网友 李俊渠 | 18分钟前 发表 |
如有侵权请联系 cloudcommunity@tencent 删除前往查看int数组索引统计字符串 | |
本站网友 盘锦生态园 | 28分钟前 发表 |
right = 0; right < m; right++){ hashS[(right) - 'a']++; if(right - left + 1 > n){ hashS[(left++) - 'a']--; }if(right - left + 1 == n && (hashS | |
本站网友 无意苦争春 | 30分钟前 发表 |
String p) { int[] hashS = new int[26]; int[] hashP = new int[26]; List<Integer> ret = new ArrayList<>(); int m = s.length() | |
本站网友 爆震伤 | 14分钟前 发表 |
方便求解 char[] p = (); int m = s0.length() | |
本站网友 小孩为什么吐奶 | 27分钟前 发表 |
如有侵权请联系 cloudcommunity@tencent 删除前往查看int数组索引统计字符串 | |
本站网友 机械师笔记本 | 13分钟前 发表 |
right = 0; right < m; right++) { hashS[s[right] - 'a']++; //进窗口 if(right - left + 1 > n){ //如果进多了 | |
本站网友 玄参的功效 | 20分钟前 发表 |
n = p0.length(); //得到两字符串长度 List<Integer> ret = new ArrayList<>(); for (int i = 0; i < n; i++) { //将p字符串扔进拟哈希表p | |
本站网友 免费刷ip | 12分钟前 发表 |
hashP用来统计字符串p的字符出现次数 | |
本站网友 和久日本料理 | 7分钟前 发表 |
就添加初始索引 | |
本站网友 cookies在哪 | 24分钟前 发表 |
14.【滑动窗口】 题目传送门 方法一:滑动窗口算法原理 新建两个哈希表(数组模拟) :通过比较两个哈希表是否一样用来判断是否是异位词 hashS用来统计字符串s的字符出现次数 | |
本站网友 注射botox | 21分钟前 发表 |
通过滑动窗口 每当right - left + 1 > 字符串p的长度的时候 | |
本站网友 白牛 | 1分钟前 发表 |
String p0) { int[] hashS = new int[26]; //通过比较两个哈希表是否一样用来判断是否是异位词 int[] hashP = new int[26]; char[] s = ();//字符串转数组 |