Leetcode+无重复字符的最长子串 小安晋升分享(第三题哦)

无重复字符的最长子串

今天是小安开始Leetcode刷题的第三题,正文开始ing?

题目描述

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

示例
【示例1】

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

【示例2】

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

【示例3】

输入: “pwwkew”
输出:3
解释:因为无重复字符的最长子串是 “wke”,所以其长度为 3。
请注意,你的答案必须是 子串 的长度,“pwke” 是一个子序列,不是子串。

方法2:暴力法

思想

【思路】
逐个检查所有的子字符串,看它是否不含有重复的字符。

代码实现

【JAVA实现】

public class Solution {
    public int lengthOfLongestSubstring(String s) {
        int n = s.length();
        int ans = 0;
        for (int i = 0; i < n; i++)
            for (int j = i + 1; j <= n; j++)
                if (allUnique(s, i, j)) ans = Math.max(ans, j - i);
        return ans;
    }

    public boolean allUnique(String s, int start, int end) {
        Set<Character> set = new HashSet<>();
        for (int i = start; i < end; i++) {
            Character ch = s.charAt(i);
            if (set.contains(ch)) return false;
            set.add(ch);
        }
        return true;
    }
}

复杂度分析

  • 时间复杂度: O ( n 3 ) O(n^3) O(n3),要验证索引范围在 [i, j)内的字符是否都是唯一的,我们需要检查该范围中的所有字符。 因此,它将花费 O ( j − i ) O(j−i) O(ji) 的时间。对于给定的 i,对于所有 j ∈ [ i + 1 , n ] j∈[i+1,n] j[i+1,n] 所耗费的时间总和为: ∑ i + 1 n O ( j − i ) \sum_{i+1}^{n}O(j - i) i+1nO(ji)
    因此,执行所有步骤耗去的时间总和为:因此,执行所有步骤耗去的时间总和为:

O ( ∑ i = 0 n − 1 ( ∑ j = i + 1 n ( j − i ) ) ) = O ( ∑ i = 0 n − 1 ( 1 + n − i ) ( n − i ) 2 ) = O ( n 3 ) O\left(\sum_{i = 0}^{n - 1}\left(\sum_{j = i + 1}^{n}(j - i)\right)\right) = O\left(\sum_{i = 0}^{n - 1}\frac{(1 + n - i)(n - i)}{2}\right) = O(n^3) O(i=0n1(j=i+1n(ji)))=O(i=0n12(1+ni)(ni))=O(n3)

  • 空间复杂度: O ( m i n ( n , m ) ) O(min(n,m)) O(min(n,m)),我们需要 O(k)的空间来检查子字符串中是否有重复字符,其中 k 表示 Set 的大小。而 Set 的大小取决于字符串 n 的大小以及字符集/字母 m 的大小。

Thanks

一起加油哦~~
附待后续揭秘的算法

int lengthOfLongestSubstring(char* s) {
    char*p = s;
    int i= 0,j = 0,len =0;
    for(j=0;*(p+j)!='\0';j++){
        for(i=0;i<j;i++){
            if(*(p+i)==*(p+j)){
                p=p+i+1;
                if(j>len) len=j;
                j=0;
        break;
            }
        }
    }
    len = (j>len)?j:len;
    return len;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值