首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >每日三题-无重复字符的最长子串、最长连续序列、找到字符串中所有字母异位词

每日三题-无重复字符的最长子串、最长连续序列、找到字符串中所有字母异位词

作者头像
才疏学浅的木子
发布2022-11-13 09:36:51
发布2022-11-13 09:36:51
46400
代码可运行
举报
文章被收录于专栏:CSDN文章CSDN文章
运行总次数:0
代码可运行

👨‍💻个人主页: 才疏学浅的木子 🙇‍♂️ 本人也在学习阶段如若发现问题,请告知非常感谢 🙇‍♂️ 📒 本文来自专栏: 算法 🌈 算法类型Hot100题 🌈

每日三题

无重复字符的最长子串

解法一

暴力 使用双层for循环来遍历,第一层for循环的是开头,第二层的是结尾 使用HashSet来保存字符,如果HashSet中存在时,add操作就会返回false,直接结束本次循环

代码语言:javascript
代码运行次数:0
运行
复制
class Solution {
    public int lengthOfLongestSubstring(String s) {
        int len  = s.length();
        if(len == 0 || len == 1)return len;
        int ans = 0;
        for(int i = 0;i < len;i++){
            int t = 1;
            HashSet<Character> set = new HashSet<>();
            set.add(s.charAt(i));
            for(int j = i+1;j < len;j++){
                if(!set.add(s.charAt(j))){
                    break;
                }
                t++;
            }
            ans = Math.max(t,ans);
        }
        return ans;
    }
}

解法二

滑动窗口 维护滑动窗口中的值是一定没有重复元素的 右边界就是当前循环的i 左边界最开始就是left = 0; 然后如果滑动窗口中有当前值就把left移动到上一个当前值的上一个位置 注意: 我滑动窗口用的HashMap所以left需要比较left与当前值的上一个位置的大小

代码语言:javascript
代码运行次数:0
运行
复制
class Solution {
    public int lengthOfLongestSubstring(String s) {
        int len  = s.length();
        if(len == 0 || len == 1)return len;
        int ans = 0;
        int left = 0;
        HashMap<Character,Integer> map = new HashMap<>();
        for(int i = 0;i < len;i++){
            if(map.containsKey(s.charAt(i))){
                left = Math.max(left,map.get(s.charAt(i))+1);
            }
            map.put(s.charAt(i),i);
            ans = Math.max(ans,i-left+1);
        }
        return ans;
    }
}

最长连续序列

解法一

暴力 把所有数据全加入到Set集合 不断枚举当前值的下一个是否在Set中存在,如果存在就一直枚举下去 剪枝: 如果set中存在当前值num的减一,那么不向后遍历这个数,因为他总是短于num-1开始的数字 举例: 假如num ~ num+n 是一段答案那么num-1 ~ num+n是优于num~num+n的

代码语言:javascript
代码运行次数:0
运行
复制
class Solution {
    public int longestConsecutive(int[] nums) {
        int len = nums.length;
        if(len <= 1)return len;
        HashSet<Integer> set = new HashSet<>();
        for(int i = 0;i < len;i++){
            set.add(nums[i]);
        }
        int res = 0;
        for(int i = 0;i < len;i++){
            if(!set.contains(nums[i]-1)){
                int curNum = nums[i];;
                int t = 1;
                while(set.contains(curNum+1)){
                    t++;
                    curNum++;
                }
                res = Math.max(res,t);
            }
        }
        return res;
    }
}

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

解法一

滑动窗口

代码语言:javascript
代码运行次数:0
运行
复制
class Solution {
    public List<Integer> findAnagrams(String s, String p) {
        int slen = s.length();
        int plen = p.length();
        List<Integer> list = new ArrayList<>();
        if(slen < plen) return list;
        int []parr = new int[26];
        int []sarr = new int[26];
        for(int i = 0;i < plen;i++){
            parr[p.charAt(i)-'a']++;
            sarr[s.charAt(i)-'a']++;
        }
        if(Arrays.equals(sarr,parr)){
            list.add(0);
        }
        for(int i = 1;i <= slen-plen;i++){
            sarr[s.charAt(i-1)-'a']--;
            sarr[s.charAt(i+plen-1)-'a']++;
            if(Arrays.equals(sarr,parr)){
                list.add(i);
            }
        }
        return list;
    }
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-11-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 每日三题
  • 无重复字符的最长子串
  • 最长连续序列
  • 找到字符串中所有字母异位词
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档