• Leetcode 438. 找到字符串中所有字母异位词


    本来计划用排序的方式,超时了

    1. class Solution {
    2. /**
    3. 2024.6.16
    4. 遍历数据,每次取子串排序,和目标串p对比下,但超时了,虽然超时了,但权当熟悉java语法了
    5. */
    6. public List findAnagrams(String s, String p) {
    7. List res=new ArrayList<>();
    8. char[] targetChars=p.toCharArray();
    9. Arrays.sort(targetChars);
    10. String targetStr=new String(targetChars);
    11. int len=p.length();
    12. for(int i=0;i<=s.length()-len;i++){
    13. String tmp=s.substring(i,i+len);
    14. char[] chars=tmp.toCharArray();
    15. Arrays.sort(chars);
    16. String tmpStr=new String(chars);
    17. if(targetStr.equals(tmpStr)){
    18. res.add(i);
    19. }
    20. }
    21. return res;
    22. }
    23. }

    438. 找到字符串中所有字母异位词 - 力扣(LeetCode)

    换种思路,其实比较abc和bac是异位词,不需要完全排序,只要它们对应字符一样就可以判定是一样的,比如a都出现1次,b都出现1次,c都出现1次。用这种思路判断,不用排序。

    1. class Solution {
    2. /**
    3. 2024.6.16
    4. 思路:其实比较abc和bac这2个异位词,不需要完全排序,只要它们对应字符一样就可以判定是一样的,
    5. 比如a都出现1次,b都出现1次,c都出现1次。用这种思路判断,不用排序。所以先对目标串p统计出一个
    6. 计数数组pChars,然后给源串s也搞一个sChars,但是滑动的搞一个,这样遍历的时候,i从0开始,当i变成1
    7. 了,sChars减一下,加一下就可以了,这样效率很高。
    8. */
    9. public List findAnagrams(String s, String p) {
    10. List res=new ArrayList<>();
    11. int sLen=s.length(),pLen=p.length();
    12. if(pLen>sLen){
    13. return res;
    14. }
    15. char[] sChars=new char[26];
    16. char[] pChars=new char[26];
    17. for(int i=0;i
    18. sChars[s.charAt(i)-'a']++;
    19. pChars[p.charAt(i)-'a']++;
    20. }
    21. for(int i=0;i
    22. if(match(sChars,pChars)){
    23. res.add(i);
    24. }
    25. // 移动下标,这个时候需要更新s字符串对应的字符统计数组
    26. // 最后一次循环的时候,i=sLen-pLen-1,那i+pLen就等于sLen-1
    27. sChars[s.charAt(i)-'a']--;
    28. sChars[s.charAt(i+pLen)-'a']++;
    29. }
    30. // 给最后一组匹配判断下 sLen-pLen到sLen-1
    31. if (match(sChars, pChars)) {
    32. res.add(sLen - pLen);
    33. }
    34. return res;
    35. }
    36. public boolean match(char[] sChars, char[] pChars){
    37. for(int i=0;i<26;i++){
    38. if(sChars[i]!=pChars[i]){
    39. return false;
    40. }
    41. }
    42. return true;
    43. }
    44. }

     

  • 相关阅读:
    MySQL日志管理、备份与恢复
    mac vscode没有写入权限/无法自动更新
    TypeScript -类型断言的简单理解
    读书笔记:Effective+Debugging-软件和系统调试的66个有效方法
    LeetCode每日一题(2402. Meeting Rooms III)
    esp8266 Task任务创建与执行
    OAuth2.0客户端基于oltu搭建
    CSDN学院 < 华为战略方法论进阶课 > 正式上线!
    arcgis中坡向计算工作原理说明
    Python正则表达式一文详解+实例代码展示
  • 原文地址:https://blog.csdn.net/salmonwilliam/article/details/139721836