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

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

无重复字符的最长子串


07f442eb8ea340c0b3b0d6dffa6f862b.png解法一

暴力

使用双层for循环来遍历,第一层for循环的是开头,第二层的是结尾

使用HashSet来保存字符,如果HashSet中存在时,add操作就会返回false,直接结束本次循环

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与当前值的上一个位置的大小

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;
    }
}


最长连续序列


5dc40499c1694e06820a43c0549812b3.png


解法一

暴力

把所有数据全加入到Set集合

不断枚举当前值的下一个是否在Set中存在,如果存在就一直枚举下去

剪枝: 如果set中存在当前值num的减一,那么不向后遍历这个数,因为他总是短于num-1开始的数字

举例: 假如num ~ num+n 是一段答案那么num-1 ~ num+n是优于num~num+n的



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


da913a38b5b8404384798e90323bb50e.png

解法一

滑动窗口

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;
    }
}
相关文章
|
7月前
|
存储
【题型总结】寻找满足字符出现奇数次/偶数次的子串个数或者子串最长长度
【题型总结】寻找满足字符出现奇数次/偶数次的子串个数或者子串最长长度
127 0
|
4月前
|
算法
【算法】滑动窗口——找到字符串中所有字母异位词
【算法】滑动窗口——找到字符串中所有字母异位词
|
7月前
|
算法 测试技术 C#
【线段树】2213. 由单个字符重复的最长子字符串
【线段树】2213. 由单个字符重复的最长子字符串
|
7月前
|
索引
leetcode-1624:两个相同字符之间的最长子字符串
leetcode-1624:两个相同字符之间的最长子字符串
38 0
|
算法
【算法专题突破】滑动窗口 - 找到字符串中所有字母异位词(14)
【算法专题突破】滑动窗口 - 找到字符串中所有字母异位词(14)
48 0
剑指offer 49. 最长不含重复字符的子字符串
剑指offer 49. 最长不含重复字符的子字符串
74 0
|
算法
leetcode-438. 找到字符串中所有字母异位词(滑动窗口)
时间复杂度: O((n - m) * m) 其中n表示s字符串的长度,m表示p字符串的长度,因为一次滑动窗口对比字符数量的时间是O(m),总共滑动n - m次
124 0
leetcode-438. 找到字符串中所有字母异位词(滑动窗口)
|
算法 索引
字符串中的第一个唯一字符&&有效的字母异位词(多思路)
字符串中的第一个唯一字符&&有效的字母异位词(多思路)
129 0
字符串中的第一个唯一字符&&有效的字母异位词(多思路)
|
算法 Python
Acwing 771.双指针 字符串中最长的连续出现的字符
Acwing 771.双指针 字符串中最长的连续出现的字符
90 0