Question

438. Find All Anagrams in a String

Solution

题目大意:给两个字符串,s和p,求p在s中出现的位置,p串中的字符无序,ab=ba

思路:起初想的是求p的全排列,保存到set中,遍历s,如果在set中出现,s中的第一个字符位置保存到结果中,最后返回结果。这种思路执行超时。可能是求全排列超时的。

思路2:先把p中的字符及字符出现的次数统计出来保存到map中,再遍历s,这个思路和169. Majority Element - LeetCode中提到的创新解法类似

Java实现:

public List<Integer> findAnagrams(String s, String p) {
List<Integer> ans = new ArrayList<>();
if (s.length() <= p.length()) return ans; // 构造map,并初始化target
Map<Character, Bo> map = new HashMap<>();
for (char tmp : p.toCharArray()) {
Bo bo = map.get(tmp);
if (bo == null) {
bo = new Bo();
map.put(tmp, bo);
}
bo.target++;
} // 前p.length()项
for (int i = 0; i < p.length(); i++) {
char cur = s.charAt(i);
Bo bo = map.get(cur);
if (bo != null) {
bo.cur++;
}
}
if (allOne(map)) ans.add(0); for (int i = p.length(); i < s.length(); i++) {
char cur = s.charAt(i);
if (map.get(cur) != null) map.get(cur).cur++;
char last = s.charAt(i - p.length());
if (map.get(last) != null) map.get(last).cur--;
if (allOne(map)) ans.add(i - p.length() + 1);
} return ans;
} public boolean allOne(Map<Character, Bo> map) {
for (Map.Entry<Character, Bo> entry : map.entrySet()) {
if (entry.getValue().cur != entry.getValue().target) return false;
}
return true;
} class Bo {
int cur; // 当前数
int target; // 目标数 public Bo() {
this(0, 0);
} public Bo(int cur, int target) {
this.cur = cur;
this.target = target;
}
}

Discuss

欣赏一下别人写的,所说下面两道题用的是同一思路,记录一下

https://leetcode.com/problems/find-all-anagrams-in-a-string/discuss/92015/ShortestConcise-JAVA-O(n)-Sliding-Window-Solution

https://leetcode.com/problems/minimum-window-substring/discuss/26808/here-is-a-10-line-template-that-can-solve-most-substring-problems

public List<Integer> findAnagrams(String s, String p) {
List<Integer> list = new ArrayList<>();
if (s == null || s.length() == 0 || p == null || p.length() == 0) return list;
int[] hash = new int[256]; //character hash
//record each character in p to hash
for (char c : p.toCharArray()) {
hash[c]++;
}
//two points, initialize count to p's length
int left = 0, right = 0, count = p.length();
while (right < s.length()) {
//move right everytime, if the character exists in p's hash, decrease the count
//current hash value >= 1 means the character is existing in p
if (hash[s.charAt(right++)]-- >= 1) count--; //when the count is down to 0, means we found the right anagram
//then add window's left to result list
if (count == 0) list.add(left); //if we find the window's size equals to p, then we have to move left (narrow the window) to find the new match window
//++ to reset the hash because we kicked out the left
//only increase the count if the character is in p
//the count >= 0 indicate it was original in the hash, cuz it won't go below 0
if (right - left == p.length() && hash[s.charAt(left++)]++ >= 0) count++;
}
return list;
}
public List<Integer> findAnagrams(String s, String p) {

    char[] ptrn = p.toCharArray();
char[] str = s.toCharArray(); int[] w = new int[26]; for(char c : ptrn) w[c - 'a']++; int start = 0; List<Integer> result = new LinkedList<>(); for(int i = 0; i<str.length; i++){
int cIndex = str[i] - 'a'; w[cIndex]--;
// the crucial bit, if we have seen the character too many times
// or it is a character that is not in the pattern, rewind the starting index
while(w[cIndex] < 0){
w[str[start] - 'a']++;
start++;
} if(i - start + 1 == ptrn.length){
result.add(start);
w[str[start] - 'a']++;
start++;
}
} return result;
}

438. Find All Anagrams in a String - LeetCode的更多相关文章

  1. 【leetcode】438. Find All Anagrams in a String

    problem 438. Find All Anagrams in a String solution1: class Solution { public: vector<int> fin ...

  2. 438. Find All Anagrams in a String

    原题: 438. Find All Anagrams in a String 解题: 两个步骤 1)就是从s中逐步截取p长度的字符串 2)将截取出的字符串和p进行比较,比较可以用排序,或者字典比较(这 ...

  3. [LeetCode] 438. Find All Anagrams in a String 找出字符串中所有的变位词

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

  4. LeetCode 438. Find All Anagrams in a String (在字符串中找到所有的变位词)

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

  5. 【LeetCode】438. Find All Anagrams in a String 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 滑动窗口 双指针 日期 题目地址:https://l ...

  6. [leetcode]438. Find All Anagrams in a String找出所有变位词

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

  7. 【leetcode❤python】 438. Find All Anagrams in a String

    class Solution(object):    def findAnagrams(self, s, p):        """        :type s: s ...

  8. 438 Find All Anagrams in a String 找出字符串中所有的变位词

    详见:https://leetcode.com/problems/find-all-anagrams-in-a-string/description/ C++: class Solution { pu ...

  9. [LC] 438. Find All Anagrams in a String

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

随机推荐

  1. 判断1~n有多少个1

    判断1~n有多少个1 例如:1~12中 1 2 3 4 5 6 7 8 9 10 11 12 有1,10,11,12中含有1,则共有5个1: 算法如下: #include<stdio.h> ...

  2. React-简单通用的抛物线动画

    一个简单通用的 React 抛物线动画demo Usage import { parabola } from "./parabola" ... onAnimate = () =&g ...

  3. JavaScript 工作原理之七-Web Workers 分类及 5 个使用场景

    Web Workers 分类及 5 个使用场景 原文请查阅这里,略有删减,本文采用知识共享署名 4.0 国际许可协议共享,BY Troland. 这是 JavaScript 工作原理的第七章. 本系列 ...

  4. spark-shell报错java.lang.IllegalArgumentException: java.net.UnknownHostException: namenode

    在使用spark on yarn启动spark-shell时,发现报错: 是说找不到主机名为namenode的主机,那么应该是配置文件出错了. 经过检查,发现是spark-defaults.conf文 ...

  5. 使用js实现复选框的全选、取消功能

    id为all的想设置全选的那个框的id,name为checkname[]的是每个小复选框: 第一种: <script> function checkAll() { var all=docu ...

  6. Blazor组件自做八 : 使用JS隔离封装屏幕键盘kioskboard.js组件

    1. 运行截图 演示地址 2. 在文件夹wwwroot/lib,添加kioskboard子文件夹,添加kioskboards.js文件 2.1 常规操作,懒加载js库, export function ...

  7. Wireshark-过滤器-数据包解析

    目录 过滤器 数据包解析 参考 推荐阅读: https://www.cnblogs.com/zwtblog/tag/计算机网络/ 过滤器 显示过滤器 和 捕获过滤器,俩者使用非常类似. 在Wiresh ...

  8. 解决“WARNINGThe remote SSH server rejected X11 forwarding request.“警告

    使用xshell连接服务器时,出现了"WARNING! The remote SSH server rejected X11 forwarding request.",意思是&qu ...

  9. c++对于c的拓展_引用的本质是指针常量

    本质:c++底层实现的指针常量(Type & ref =val; // Type *const ref =&val)

  10. redis的基础命令操作

    文章目录 前言 一.字符串类型 二.哈希类型 三.列表类型 四.集合类型 五.有序集合类型 六.通过命令 前言 redis的数据结构 redis存储的是key,value格式的数据,其中的key是字符 ...