LeetCode 438 Find All Anagrams in a String解析

leetcode 438 解析

题目描述
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”.

看到这个题目,要求给定字符串s,和一个字符串p。要求返回字符串s中,包含字符串p所有元素的子串的起始位置。
拟采用滑动窗口方法求解。过程如下:

class Solution {
    public List<Integer> findAnagrams(String s, String p) {
        List<Integer> list = new ArrayList();
        //判断为空

        char[] pchars = p.toCharArray();
        int[] freq = new int[256]; //保存p中各个字符的个数
        for(char c: pchars){
            freq[c]++;
        }
        int l = 0, r = 0, count = p.length();
        while(r < s.length()){
            if(freq[s.charAt(r++)]-- >= 1){
                //说明当前字符在p中
                count--;  
            }

            if(count == 0) list.add(l);

            if(r-l == p.length() && freq[s.charAt(l++)]++ >=0 ){
                count++;
            }
        }
        return list;
    }
}

思路很简单:
1. l,r代表滑动窗口的起始点和结束点。用count来代表滑动窗口中,子串包含p字符的个数,初始化为count =p.length()。用freq数组保存p字符串中各个元素出现的次数;
2. 第一个if表示:如果当前字符是p中的字符,那么count–,另外freq[c]对应字符c的次数减一,表示还剩下几个字符c。注意,当字符不是p中字符时,r++;
3. 当count减为0,表示找出了符合条件的子串。那么存入;
4. 接着继续往后找,如果r-l == p.length(),这说明找到了第一个符合条件的子串或者是没找到。接着都需要把l往后滑动一位,这时候需要判断l处的字符是不是p中的字符。若是,还需将l对应字符次数加一,count加一。这样持续循环。

if(count == 0)这个条件必须放在三个if的中间。因为若从l=0,r=0处往后找count个字符正好满足条件的话,这时候需要保存l=0这个值。如若不然(if条件放在第三个),那么在第二个if处又count++,那么count不为0,则结果不完整

利用 TensorFlow 训练自己的目标识别器。本文内容来自于我的毕业设计,基于 TensorFlow 1.15.0,其他 TensorFlow 版本运行可能存在问题。.zip项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全领域),有任何使用问题欢迎随时与我联系,我会及时为您解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明(如有)等。答辩评审平均分达到96分,放心下载使用!可轻松复现,设计报告也可借鉴此项目,该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的。 【提供帮助】:有任何使用问题欢迎随时与我联系,我会及时解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 下载后请首先打开README文件(如有),项目工程可直接复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值