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

示例 1:

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

示例 2:

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

示例 3:

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

思路分析:

(1)首先要理解一个思路,如果[i,j]是不重复的,那么要判断[i,j+1]是否重复,就只要判断[j+1]在[i,j]是否存在,越界检查。

这里的计算就是:

设'abcabcbb',len=8,

从(0,1)(含左不含右)开始,不等于len,进入else条件,'a'不包括下一个字符'b',依次循环,

到了(0,3)的时候,str="abc",包含下一个字符'c',result="abc",跳出循环,

进入(1,2),str="b",一直到(1,4),包含下一个字符'b',result长度等于str长度,所以result不变。跳出循环,

进入(2,3),str="c",依次循环,最后一直到最后str的长度也没有超过result。最终得出result为abc,所以长度为3。

时间复杂度:O(n^2)

空间复杂度:O(n^2)

代码:

class Solution {
public int lengthOfLongestSubstring(String s) {
int len = s.length();
String result = ""; //最长的不重复子串
String str = ""; //子串
for(int i=;i<len;i++){
for(int j=i+;j<=len;j++){
str = s.substring(i,j); //嵌套循环截取子串
if(j==len){ //截取带最后进行对比
result = result.length()<str.length()?str:result;
break;
}else{ //如果没有到最后就判断下一位是否在子串中
if(str.indexOf(s.substring(j,j+))>-){
result = result.length()<str.length()?str:result;
break;
}
}
}
}
return result.length();
}
}

(2)利用HashMap解题思路:

举个例子:s="abcbadca"; i= 0;j=0

依次把{a:1,b:2,c:3}存入map,此时ans = 3,i=0,j=3;

下一次进入的时候,因为‘b'已存在map中,所以i会被设为2,即字符数组中第一个b的后一个位置。同时map里面的b对应的值会被更新为4,然后判断ans的值,同时map里面的b对应的值会被更新为4。

依次计算,就可以把最长不重复子串的长度得出。这里只有一个循环,map的查找时间复杂度为O(1),比之前的两种方法都快。

时间复杂度:O(n);

空间复杂度:O(1)       //因为字符的总个数是固定的,所以map的长度也是固定的常数;

代码:

public class Solution {
public int lengthOfLongestSubstring(String s) {
int n = s.length(), ans = ;
Map<Character, Integer> map = new HashMap<>(); //存放字符数组和索引,key:char,value:index
for (int j = , i = ; j < n; j++) {
if (map.containsKey(s.charAt(j))) {
i = Math.max(map.get(s.charAt(j)), i); //包含下一个字符就把i移到相同字符的后一个位置
}
ans = Math.max(ans, j - i + ); //判断长度是否要改变
map.put(s.charAt(j), j + ); //把字符和索引放进map,重复的会进行覆盖
}
return ans;
}
}

【LeetCode】3. 无重复字符的最长子串的更多相关文章

  1. Leetcode(三)无重复字符的最长子串

    3. 无重复字符的最长子串 题目描述 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例: 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最 ...

  2. 【LeetCode】无重复字符的最长子串【滑动窗口法】

    给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例 1: 输入: "abcabcbb"输出: 3 解释: 因为无重复字符的最长子串是 "abc&quo ...

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

    题目链接:(https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/) 题目描述: 给定一个字符 ...

  4. 【leetcode 3. 无重复字符的最长子串】解题报告

    思路:滑动窗口的思想 方法一:滑动窗口 int lengthOfLongestSubstring(string s) { /* 控制一个滑动窗口,窗口内的字符都是不重复的,通过set可以做到判断字符是 ...

  5. LeetCode 3: 无重复字符的最长子串 Longest Substring Without Repeating Characters

    题目: 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. Given a string, find the length of the longest substring withou ...

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

    难度: 中等 题目 Given a string, find the length of the longest substring without repeating characters. 给定一 ...

  7. 力扣Leetcode 3. 无重复字符的最长子串

    无重复字符的最长子串 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例 示例 1: 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串 ...

  8. [LeetCode]3. 无重复字符的最长子串(滑动窗口)

    题目 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例 1: 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc ...

  9. [LeetCode]3.无重复字符的最长子串(Java)

    原题地址: longest-substring-without-repeating-characters/submissions 题目描述: 示例 1: 输入: s = "pwwkew&qu ...

  10. LeetCode 3. 无重复字符的最长子串(Longest Substring Without Repeating Characters)

    题目描述 给定一个字符串,找出不含有重复字符的最长子串的长度. 示例: 给定 "abcabcbb" ,没有重复字符的最长子串是 "abc" ,那么长度就是3. ...

随机推荐

  1. Docker网络解决方案-Flannel(转)

    转自https://www.cnblogs.com/kevingrace/p/6859114.html Docker跨主机容器间网络通信实现的工具有Pipework.Flannel.Weave.Ope ...

  2. express 与 koa 区别

    express 与 koa 区别 区别项 express koa 中间件模型 Compress 模型 洋葱圈模型 对象个数 只有2个对象:Request 和 Response 有3个对象:Reques ...

  3. MySQL 检索数据(SELECT)

    检索单个列  mysql> SELECT  列名  FROM  表名; 如下,从表products中检索prod_name列 mysql> SELECT  prod_name  FROM  ...

  4. Android 单元测试覆盖率计算

    在工程下面的build.gradle 增加配置 1.增加Plugin apply plugin: 'jacoco' 2. 增加jacoco版本 jacoco{ version "0.7.4. ...

  5. redis : 桌面管理工具 redis-desktop-manager使用指南

    概要:一款好用的Redis桌面管理工具,支持命令控制台操作,以及常用,查询key,rename,delete等操作. 下载软件,请点击下面链接,进入下载页,选择对应版本: https://redisd ...

  6. kafka_2.11-0.10.0.1生产者producer的Java实现

    转载自:http://blog.csdn.net/qq_26479655/article/details/52555283 首先导入包 将kafka目录下的libs中的jar包导入 用maven建立 ...

  7. JDBC相关概念介绍

    一.JDBC相关概念介绍 1.1.数据库驱动 这里的驱动的概念和平时听到的那种驱动的概念是一样的,比如平时购买的声卡,网卡直接插到计算机上面是不能用的,必须要安装相应的驱动程序之后才能够使用声卡和网卡 ...

  8. IDEA创建简单servlet程序

    创建项目 创建完后的目录结构为: web项目配置 在WEB-INF目录下新建两个文件夹,分别命名未classes和lib(classes目录用于存放编译后的class文件,lib用于存放依赖的jar包 ...

  9. 自动控制中常用的Matlab命令

    部分分式展开:[r p k]=residue[num,den] 传递函数到状态空间:[A, B, C, D]=tf2ss(num, den)  % 状态空间不唯一,Matlab给出其中一种 状态空间到 ...

  10. 分布式消息队列RocketMQ--事务消息--解决分布式事务

    说到分布式事务,就会谈到那个经典的”账号转账”问题:2个账号,分布处于2个不同的DB,或者说2个不同的子系统里面,A要扣钱,B要加钱,如何保证原子性? 一般的思路都是通过消息中间件来实现“最终一致性” ...