0
点赞
收藏
分享

微信扫一扫

LeetCode算法之无重复字符的最长子串

LeetCode算法之无重复字符的最长子串_字符串

题目

给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。

示例 1:

输入: s = "abcabcbb"

输出: 3  

解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。

示例 2:

输入: s = "bbbbb"

输出: 1

解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。

示例 3:

输入: s = "pwwkew"

输出: 3

解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。

    请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。

提示:

  • 0 <= s.length <= 5 * 104
  • s 由英文字母、数字、符号和空格组成

解法

简单解法

class Solution {
    public int lengthOfLongestSubstring(String s) {
        int len = 0;// 定义最大长度
        if (s.length() < 2) {
            len = s.length();//长度为1或0就不用比较判断了
        } else {
            char[] charArray = s.toCharArray();// 转为字符数组
            String ss = String.valueOf(charArray[0]);
            for (int i = 1; i < s.length(); i++) {
                if (!ss.contains(String.valueOf(charArray[i]))) { //判断是否含有该字符
                    ss = ss + charArray[i]; //将不重复的拼接成新字符串
                } else {
                    len = Math.max(len, ss.length()); //判断最大值
                    int index = ss.indexOf(charArray[i]);// 取相同字符数组下标
                    ss = ss.substring(index + 1) + charArray[i];// 截取字符为新字符串
                }
            }
            len = Math.max(len, ss.length());// 选最大值
        }
        return len;
    }
}

滑动窗口和哈希集合的方法

class Solution {
    public int lengthOfLongestSubstring(String s) {
        int n = s.length(); // 获取字符串的长度
        Set<Character> set = new HashSet<>(); // 创建一个哈希集合用于存储字符
        int maxLen = 0, left = 0, right = 0; // 初始化最大长度和滑动窗口的左右边界

        while (left < n && right < n) { // 开始遍历字符串
          if (!set.contains(s.charAt(right))) { // 如果当前字符不在哈希集合中
            set.add(s.charAt(right)); // 将其加入集合
            right++; // 右边界向右移动
            maxLen = Math.max(maxLen, right - left); // 更新最大长度
          } else { // 如果当前字符已经在哈希集合中
            set.remove(s.charAt(left)); // 从集合中移除窗口左边界的字符
            left++; // 左边界向右移动
          }
        }
        return maxLen; // 返回最大长度
    }
}

举报

相关推荐

0 条评论