力扣刷题第438题(1)

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

提示:

  • 1 <= s.length, p.length <= 3 * 104

  • s 和 p 仅包含小写字母


经验总结:

1:技巧方法方面

通过本题,在比较二十六个英文字母时候 开辟计数数组count是比较方便的,给出一个字符串统计其中的字符出现个数,其实是比较好操作的,因为数字 0 - 9 十个 ,大小写 各自26个,这些全部加起来,也还是常数级内进行操作。。。用到的时间和空间复杂度都为O(1)

但是有时候数字他不给出限制 大小,自己做数组,用下标存储,浪费太大了

本题考察的思想,关于哈希表方面的,其实无非就是 用数组做个哈希表,存放小写字母出现的个数,这些在考察字母异位词,赎金信问题中,打的一拳开,免得百拳来。

2:其次,关于滑动窗口,以前对滑动窗口的理解还是不够深,如本题为什么人家的方法能比我的快,用时10ms以内,而我的虽然用暴力安慰奖超过百分之五,用时两千毫秒,再用“滑动数组”依然是百分之十,用时一千毫秒呢?仔细分析,原因莫不是我的“滑动窗口” 是真假美猴王。

我没有掌握理解滑动窗口的思想。 仔细分析大佬的题解,每次滑动窗口 大佬的·题解是:

最核心的一点,大佬的思想是:

因为cntS这个计数数组本质上就是记录一定长度内子串的每个字符对应的小写字母出现的个数。

所以每次就通过左边的字母出现的次数 减一

右边窗口新增进来的字母的次数 加一 进行重复利用的操作 。一旦P字符串长度数十万,S字符串只用读取一次十万 统计出现个数,之后每次加一减一。

滑动窗口真可谓是YYDS了!

至此才算是初窥门径,略懂皮毛。算法思想博大精深!

而我的所谓“双指针”“滑动数组”,其实无非就是,位置的加一减一,变更位置后,还是对符合条件的数组重新读取,再次操作,存入cntS这个统计S字符串中 长度等于P字符串的子串中的各个字符出现的个数。实在是粗陋浅薄,不堪入目~~~

真&滑动窗口


找到字符串中所有字母异位词

提交记录

61 / 61 个通过测试用例

状态:通过

执行用时: 10 ms

内存消耗: 39.1 MB

邀请好友来挑战 找到字符串中所有字母异位词

语言: java

添加备注

class Solution

{

public List findAnagrams(String s, String p)

{

//首先变量命名不要给自己找麻烦 这种Oj题目大小写容易分辨不出来

//其次三种情况

int slen = s.length();

int plen = p.length();

List list = new ArrayList ();

if(slen < plen)

{

return list;

}

int [] scnt = new int[26];

int [] pcnt = new int [26];

for(int i = 0; i < plen ; i++)

{

scnt[s.charAt(i)-‘a’]++;

pcnt[p.charAt(i)-‘a’]++;

}

if(Arrays.equals(scnt,pcnt))

list.add(0);

for(int i = plen;i< slen ; i++)

{

scnt[s.charAt(i-plen)-‘a’]–;

scnt[s.charAt(i)-‘a’]++;

if(Arrays.equals(scnt,pcnt))

{

list.add(i-plen+1);

}

}

return list;

}

}


假&滑动窗口

class Solution

{

public List findAnagrams(String s, String p)

{

int sLen = s.length();

int pLen = p.length();

List list = new ArrayList ();

int left = 0;

int right = 0;

if(sLen<pLen)

{

return list;

}

while(right < sLen)

{

if(right-left+1 == pLen)

{

int[] cntP = new int[26];

int[] cntS = new int[26];

for(int i=0;i<pLen;i++)

{

cntP[p.charAt(i)-‘a’]++;

}

for(int i=left;i<left+pLen;i++)

{

cntS[s.charAt(i)-‘a’]++;

}

if(Arrays.equals(cntP,cntS))

{

list.add(left);

}

left++;

}

right++;

}

return list;

}

}


上述仅为针对本题的 滑动窗口 思想

下面补充 滑动窗口的相关

细节知识点

首先:滑动窗口,窗口根据右边的动,我在编程过程中,考虑过 如 p字符串长度为3,而s字符串长度为7时候,则在右边right滑动到  下标为6,第七位的时候就结束,但是如果

s=abcdefabc

p=abc,那就直接漏了一种情况。直接破防 这是右边的一种。

滑动窗口,本质上是双指针,还有快慢指针,这种双指针的情况其实盯着快慢指针中的快指针,

滑动窗口中的右边栏,切记滑动窗口右边栏一定要滑动到底~!

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:前端)

最后

你要问前端开发难不难,我就得说计算机领域里常说的一句话,这句话就是『难的不会,会的不难』,对于不熟悉某领域技术的人来说,因为不了解所以产生神秘感,神秘感就会让人感觉很难,也就是『难的不会』;当学会这项技术之后,知道什么什么技术能做到什么做不到,只是做起来花多少时间的问题而已,没啥难的,所以就是『会的不难』。

我特地针对初学者整理一套前端学习资料,免费分享给大家,戳这里即可免费领取

前端路线图

帮助,可以扫码获取!!(备注:前端)**

[外链图片转存中…(img-uIitUB1b-1713731449802)]

最后

你要问前端开发难不难,我就得说计算机领域里常说的一句话,这句话就是『难的不会,会的不难』,对于不熟悉某领域技术的人来说,因为不了解所以产生神秘感,神秘感就会让人感觉很难,也就是『难的不会』;当学会这项技术之后,知道什么什么技术能做到什么做不到,只是做起来花多少时间的问题而已,没啥难的,所以就是『会的不难』。

我特地针对初学者整理一套前端学习资料,免费分享给大家,戳这里即可免费领取

[外链图片转存中…(img-lVDcwZSy-1713731449802)]

vue.js的36个技巧

  • 18
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,关于力扣刷题C++常用操作,我可以给你一些常见的操作和技巧: 1. 使用 STL 容器和算法库:STL(Standard Template Library)是 C++ 标准库中的一个重要组成部分,包含了许多常用的容器和算法。在力扣刷题中,使用 STL 可以大大提高代码的效率和可读性。例如,vector 可以用来存储动态数组,sort 可以用来排序等等。 2. 使用 auto 关键字:auto 关键字可以自动推导变量类型,可以减少代码量和提高可读性。例如,auto x = 1; 可以自动推导出 x 的类型为 int。 3. 使用 lambda 表达式:lambda 表达式是 C++11 中引入的一种匿名函数,可以方便地定义一些简单的函数对象。在力扣刷题中,使用 lambda 表达式可以简化代码,例如在 sort 函数中自定义比较函数。 4. 使用位运算:位运算是一种高效的运算方式,在力扣刷题中经常会用到。例如,左移运算符 << 可以用来计算 2 的幂次方,右移运算符 >> 可以用来除以 2 等等。 5. 使用递归:递归是一种常见的算法思想,在力扣刷题中也经常会用到。例如,二叉树的遍历、链表的反转等等。 6. 使用 STL 中的 priority_queue:priority_queue 是 STL 中的一个容器,可以用来实现堆。在力扣刷题中,使用 priority_queue 可以方便地实现一些需要维护最大值或最小值的算法。 7. 使用 STL 中的 unordered_map:unordered_map 是 STL 中的一个容器,可以用来实现哈希表。在力扣刷题中,使用 unordered_map 可以方便地实现一些需要快速查找和插入的算法。 8. 使用 STL 中的 string:string 是 STL 中的一个容器,可以用来存储字符串。在力扣刷题中,使用 string 可以方便地处理字符串相关的问。 9. 注意边界条件:在力扣刷题中,边界条件往往是解决问的关键。需要仔细分析目,考虑各种边界情况,避免出现错误。 10. 注意时间复杂度:在力扣刷题中,时间复杂度往往是评判代码优劣的重要指标。需要仔细分析算法的时间复杂度,并尽可能优化代码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值