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

虽然是一道中等题,但我5分钟就写完了,而且是看完题就知道怎么写,这一看就知道双指针,一个左一个右,右指针往后移如果没有重复的长度+1;如果有重复的,左指针往右移,那如何判断重复呢,这多简单,Hashset的congtains方法啊,所以一下子就写出来了,但是效率确实不高,只击败了百分之九,以下是我的代码:

java 复制代码
class Solution {
    public int lengthOfLongestSubstring(String s) {
         int ans =0;
         int n = s.length();
         for(int i = 0;i<n;i++){
             HashSet<Character> set = new HashSet<>();
             set.add(s.charAt(i));
             int count = 1;
             for(int j = i+1;j<n;j++){
                 if(!set.contains(s.charAt(j))){
                     set.add(s.charAt(j));
                     count++;
                 }else{
                     break;
                 }
             }
             ans = Math.max(ans, count);
         }
         return ans;
    }
}

看了一下题解,题解就更优了一点,他的右指针只需要往右移动一遍即可。

字符串abcabcbb为例,找出从每一个字符开始的,不包含重复字符的最长子串,那么其中最长的那个字符串即为答案。

可以发现最长字串起始位置递增的时候,结束位置也在递增,这是因为:假如我们选第k个字符为起始位置,第r个字符是它的结束位置,那么下次选择第k+1个字符为起始位置的时候,第k+1到r一定是不重复的,而且由于少了第k个字符,那么结束位置一定大于等于r,所以右指针不需要回去,

但是题解和左右指针又不完全一样,它用的是滑动窗口,就是用一个Hashset作为一个滑动窗口,里面装了左右指针之间的这一段字符,如果左指针右移,那么hashset就要删掉左指针之前指的那个字符;如果右指针右移,那么hashset就要加入右指针新指的字符了,子串的长度就是右指针-左指针+1,以下是题解代码:

java 复制代码
class Solution {
    public int lengthOfLongestSubstring(String s) {
         int ans =0;
         int n = s.length();
         for(int i = 0;i<n;i++){
             HashSet<Character> set = new HashSet<>();
             set.add(s.charAt(i));
             int count = 1;
             for(int j = i+1;j<n;j++){
                 if(!set.contains(s.charAt(j))){
                     set.add(s.charAt(j));
                     count++;
                 }else{
                     break;
                 }
             }
             ans = Math.max(ans, count);
         }
         return ans;
    }
}
相关推荐
你不是我我16 分钟前
【Java 开发日记】我们来说一说 Redis 主从复制的原理及作用
java·redis·github
程序员葫芦娃16 分钟前
【Java毕设项目】基于SSM的旅游资源网站
java·开发语言·数据库·编程·课程设计·旅游·毕设
Pocker_Spades_A16 分钟前
飞算Java在线学生成绩综合统计分析系统的设计与实现
java·开发语言·java开发·飞算javaai炫技赛
肉丸滚球19 分钟前
飞算 JavaAI 转 SpringBoot 项目沉浸式体验:高效开发在线图书借阅平台
java·spring boot·后端
叫我阿柒啊21 分钟前
从Java全栈到前端框架:一场真实的技术面试对话
java·vue.js·spring boot·微服务·typescript·前端开发·后端开发
鸽鸽程序猿23 分钟前
【JavaSE】简单理解JVM
java·jvm
Francek Chen24 分钟前
【飞算JavaAI】智能开发助手赋能Java领域,飞算JavaAI全方位解析
java·开发语言·人工智能·ai编程·飞算
yyovoll33 分钟前
Java包和权限的知识点介绍
java·spring
林shir39 分钟前
Java基础1.7-数组
java·算法
好奇的菜鸟1 小时前
Docker 一键启动:打造高效的 Java 微服务开发环境
java·docker·微服务