【LeetCode】第8天 - 3. 无重复字符的最长子串 | 567 字符串的排列

简介: 【LeetCode】第8天 - 3. 无重复字符的最长子串 | 567 字符串的排列

题目描述

题目1(3. 无重复字符的最长子串)

在这里插入图片描述

题目2(567 字符串的排列)

在这里插入图片描述

解题思路

题目1(3. 无重复字符的最长子串)

  • 使用一个哈希表map存储无重复字符的字串(key),以及在字符串中的位置(value)
  • 使用两个指针(start,end)分别指向无重复字符字串的首尾
  • 遍历字符串的每个字符,如果map中不存在该字符,将其加入map,并更新当前最大无重复字串长度;若存在,更新start位置。

题目2(567 字符串的排列)

遍历 s2 中的每个长度为 s1.length() 的子串,判断子串和 s1​ 中每个字符的出现次数是否相等,若相等,返回true。

代码实现

题目1(3. 无重复字符的最长子串)

class Solution {
    public int lengthOfLongestSubstring(String s) {
        int n = s.length();
        Map<Character, Integer> map = new HashMap<>();
        int maxLength = 0, start = 0;
        for(int end=0;end<n;end++){
            char temp = s.charAt(end);    //当前字符
            if(map.containsKey(temp)){
                start = Math.max(map.get(temp)+1, start);
            }
            maxLength = Math.max(maxLength, end - start + 1);
            map.put(temp, end);
        }
        return maxLength;
    }
}

题目2(567 字符串的排列)

class Solution {
    public boolean checkInclusion(String s1, String s2) {
        if(s1.length() > s2.length()) return false;    //s1长度必定不大于s2
        int[] count1 = new int[26];
        int[] count2 = new int[26];

        for(int i=0;i<s1.length();i++){
            ++count1[s1.charAt(i) - 'a'];
            ++count2[s2.charAt(i) - 'a'];
        }
        if(Arrays.equals(count1, count2)) return true;

        for(int i=s1.length();i<s2.length();i++){
            ++count2[s2.charAt(i) - 'a'];
            --count2[s2.charAt(i-s1.length()) - 'a'];
            if(Arrays.equals(count1, count2)) return true;
        }
        return false;
    }
}
目录
相关文章
|
2月前
|
Go C++
【力扣】2696. 删除子串后的字符串最小长度(模拟 栈 C++ Go实现栈)
【2月更文挑战第18天】2696. 删除子串后的字符串最小长度(模拟 栈 C++ Go实现栈)
34 6
|
11天前
|
算法
代码随想录算法训练营第五十五天 | LeetCode 583. 两个字符串的删除操作、72. 编辑距离、编辑距离总结
代码随想录算法训练营第五十五天 | LeetCode 583. 两个字符串的删除操作、72. 编辑距离、编辑距离总结
22 1
|
存储 编译器 Linux
标准库中的string类(中)+仅仅反转字母+字符串中的第一个唯一字符+字符串相加——“C++”“Leetcode每日一题”
标准库中的string类(中)+仅仅反转字母+字符串中的第一个唯一字符+字符串相加——“C++”“Leetcode每日一题”
|
15天前
|
机器学习/深度学习 索引
【力扣】387. 字符串中的第一个唯一字符
【力扣】387. 字符串中的第一个唯一字符
|
2月前
|
网络协议
《 LeetCode 热题 HOT 100》——无重复字符的最长子串
《 LeetCode 热题 HOT 100》——无重复字符的最长子串
|
2月前
|
存储
leetcode2744. 最大字符串配对数目
leetcode2744. 最大字符串配对数目
17 0
|
2月前
|
机器学习/深度学习 NoSQL Shell
力扣刷题-翻转字符串
力扣刷题-翻转字符串
12 1
|
2月前
|
算法 Java
[Java·算法·简单] LeetCode 28. 找出字符串中第一个匹配项的下标 详细解读
[Java·算法·简单] LeetCode 28. 找出字符串中第一个匹配项的下标 详细解读
23 0
|
2月前
|
Go C++
【力扣】2645. 构造有效字符串的最小插入数(动态规划 贪心 滚动数组优化 C++ Go)
【2月更文挑战第17天】2645. 构造有效字符串的最小插入数(动态规划 贪心 滚动数组优化 C++ Go)
31 8
|
2月前
|
机器学习/深度学习 算法
力扣刷题日常(一)
力扣刷题日常(一)
20 2

热门文章

最新文章