找到字符串中的字母异位词
给定两个字符串 s 和 p,找到 s 中所有 p 的 异位词 的子串,返回这些子串的起始索引。不考虑答案输出的顺序。
示例 1:
输入: s = "cbaebabacd", p = "abc"
输出: 0,6
解释:
起始索引等于 0 的子串是 "cba", 它是 "abc" 的异位词。
起始索引等于 6 的子串是 "bac", 它是 "abc" 的异位词。
思路:
利用滑动窗口+词频统计思路
以短串p的长度为窗口在s串上进行滑动,每次统计窗口内的字符出现频率和p的进行比较,如果相同,则加入起始索引
涉及语法和数据结构:
Listres
int\[\] fre
Arrays.equals(A,B)->直接比较两个数组
class Solution {
public List findAnagrams(String s, String p) {
List res=new ArrayList<>();
int n=s.length();
int m=p.length();
if(n<m)return res;
int\[\] sfre=new int26;
int\[\] pfre=new int26;
for(int i=0;i<m;i++){
sfres.charAt(i)-'a'++;
pfrep.charAt(i)-'a'++;
}
if(Arrays.equals(sfre,pfre)){
res.add(0);
}
for(int i=m;i<n;i++){
sfres.charAt(i)-'a'++;
sfres.charAt(i-m)-'a'--;
if(Arrays.equals(sfre,pfre)){
res.add(i-m+1);
}
}
return res;
}
}
和为K的子数组个数
给你一个整数数组 nums 和一个整数 k ,请你统计并返回 该数组中和为 k 的子数组的个数 。
子数组是数组中元素的连续非空序列。
示例 1:
**输入:**nums = 1,1,1, k = 2
**输出:**2
思路:前缀和+HashMap哈希表
前缀和-k如果存在于HashMap中,则将前缀和-k对应出现次数加到计数器里
语法:presummap.getOrDefault(sum,0)
如果sum这个key对应value有值则取对应值,如果没有则取默认值,这里设置为0
-
我们准备一个哈希表 (
Map),用来记录**"某个前缀和出现的次数"**。 -
初始化哈希表:
map.put(0, 1)。意思是"前缀和为 0 的情况出现过 1 次"(即还没开始遍历,总和为 0)。 -
初始化当前前缀和
sum = 0,结果计数count = 0。 -
遍历数组,把当前元素累加到
sum中。 -
看看哈希表里有没有
sum - k:- 如果有,说明我们找到了之前的某个历史前缀和,从那个位置到当前位置的子数组和就是
k。把对应的次数累加到count中。
- 如果有,说明我们找到了之前的某个历史前缀和,从那个位置到当前位置的子数组和就是
-
把当前的
sum存入哈希表(如果已经存在,就把次数 +1)。 -
遍历结束,返回
count。
class Solution {
public int subarraySum(int\[\] nums, int k) {
Map<Integer,Integer> presummap=new HashMap<>();
presummap.put(0,1);
int count=0;
int sum=0;
for(int num:nums){
sum+=num;
if(presummap.containsKey(sum-k)){
count+=presummap.get(sum-k);
}
presummap.put(sum,presummap.getOrDefault(sum,0)+1);
}
return count;
}
}