美文网首页
字符串 - 最长无重复子串的长度

字符串 - 最长无重复子串的长度

作者: greedycr7 | 来源:发表于2020-08-10 09:55 被阅读0次

3. 无重复字符的最长子串

题目描述

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

示例 1:
输入: "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。

示例 2:
输入: "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。

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

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

算法思想

解法一:动态规划
在做算法题的过程中,遇到最值问题首先还是往贪心和动态规划上靠拢。这一题和 最长回文子串 的动态规划解法如出一辙。
1)定义状态:dp[i][j] 表示子串s[i, j]是否为无重复子串,且i < j
2)状态转移方程:s[i, j]是无重复子串的条件是:子串s[i+1, j]是无重复的且子串s[i+1, j]中不包含与s[i]重复的字符 或者 子串s[i, j-1]是无重复的且子串s[i, j-1]中不包含与s[j]重复的字符。
dp[i][j] = (dp[i+1][j] && s[i] ∉ s[i+1, j]) || (dp[i][j-1] && s[j] ∉ s[i, j-1]),其中符号表示 "不属于"
3)考虑边界:i < j


解法二:滑动窗口
滑动窗口的解题方法是看了力扣官网上网友分享的解法,非常的给力,点击这里查看这位网友的分享。


代码实现

解法一:动态规划*

class Solution {
    public int lengthOfLongestSubstring(String s) {
        int len = s.length();
        if (len == 0) {
            return 0;
        }

        boolean[][] dp = new boolean[len][len];
        for (int i = 0; i < len; i++) {
            Arrays.fill(dp[i], true);
        }

        int maxLength = 1;
        for (int j = 1; j < len; j ++) {
            for (int i = 0; i < j; i++) {
                if ((dp[i + 1][j] && s.substring(i + 1, j + 1).indexOf(s.charAt(i)) == -1) && (dp[i][j - 1] && s.substring(i, j).indexOf(s.charAt(j)) == -1)) {
                    dp[i][j] = true;
                } else {
                    dp[i][j] = false;
                }

                if (dp[i][j] && j - i + 1> maxLength) {
                    maxLength = j - i + 1;
                }
            }
        }

        return maxLength;
    }
}

时间复杂度O(n^2)
空间复杂度O(n^2)
说明:上面的代码在力扣上提交后,会出现超过内存限制的提示,说明了虽然DP能够解决这一问题,但是并不是最优的解法,而比较优秀的解法就是采用滑动窗口来实现


解法二:滑动窗口

class Solution {
    public int lengthOfLongestSubstring(String s) {
        // 定义集合来作为滑动窗口
        Set<Character> set = new HashSet<>();
        // left为滑窗左边界,right为滑窗右边界
        int left = 0, right = 0;
        int maxLength = 0;
        int len = s.length();
        while (left < len && right < len) {
            if (!set.contains(s.charAt(right))) {
                set.add(s.charAt(right));
                maxLength = Math.max(maxLength, right - left + 1);
                right ++;
            } else {
                set.remove(s.charAt(left));
                left ++;
            }
        }
        return maxLength;
    }
}

时间复杂度O(n)
空间复杂度O(n)


相关文章

  • 算法1-无重复字符的最长子串

    无重复字符的最长子串 首先分析一下题目,求给定字符串的最长不重复子串,思路应该是分治不断降规模,把长度为n的字符串...

  • 3、Longest SubString Without Repe

    Examples:找出最长无重复子串长度Given "abcabcbb", the answer is "abc"...

  • 【leetcode3】 3. Longest Substrin

    关键字:最长不重复子串、双指针 难度:Medium 题目大意:求一个字符串最长不重复子串的长度 题目: Given...

  • iOS面试题汇总---算法类

    字符串 【3】最长回文子串 【3】最长无重复子串 【1*】字符串转数字 【4】KMP 算法 【2】字符串全排列 【...

  • 3. Loongest Substring Without Re

    题目 给定一个字符串 s,找出这个不重复字符串的最长字串长度。 解析 找出这个字符串不重复子串的最大长度。记录上一...

  • Python编程题16--最长不重复子串

    题目 给定一个字符串,请从这个字符串中找出所有最长的没有重复字符的子串,并返回最长不重复子串的长度。 例如:字符串...

  • 无重复字符串的最长子串

    题目大意:给定一个字符串,找出不含有重复字符的最长子串的长度 解读: 1、给定abcabcbb,没有重复子串的最长...

  • 文章收藏

    iOS面试题系列之常见算法 排序算法整理 字符串【3】最长回文子串【3】最长无重复子串【1*】字符串转数字【4】K...

  • [Leetcode][3][longest substring

    题目描述: 最长连续无重复子字符串Example 1: Input: "abcabcbb"Output: 3Exp...

  • 最长不重复问题

    题目:求最长无重复子串从一个字符串中找到一个连续子串,该子串中任何两个字符不能相同,求子串的最大长度并输出一条最长...

网友评论

      本文标题:字符串 - 最长无重复子串的长度

      本文链接:https://www.haomeiwen.com/subject/ntfrdktx.html