[LeetCode]Longest Substring Without Repeating Characters

news/2024/6/18 19:03:27 标签: 数据结构与算法, java, scala

题目:

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

示例 1:

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

示例 2:

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

示例 3:

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

第一想法:

java:

java">public static int lengthOfLongestSubstring(String s) {
        //使用Set滑动方式进行子串的存储
        Set<Character> set = new HashSet<>();
        int lenth = s.length();
        int ans=0, i = 0, j = 0;
        while (i<lenth && j<lenth){
            //当set中不存在当前字符时,将j位置的字符存入set,同时j向前一步继续比较
            if (!set.contains(s.charAt(j))){
                set.add(s.charAt(j++));
                //取最长的子串距离
                ans = Math.max(ans, j - i);
            }
            //存在时将尾部i位置的值移除,知道子串中不存在j位置相同的字符.
            //**问题**:如果相同字符存在j-1的位置,那么就需要进行j-i次循环,可以考虑使用map记录位置,直接找到相同字符进行滑动.
            else {
                set.remove(s.charAt(i++));
            }
        }
        return ans;
    }

scala:

scala">def LongestSubstring(s:String):Int = {
    var res: Int = 0
    val set = new mutable.HashSet[Char]
    var head = 0
    var foot = 0
    val lenth = s.length
    while (head<lenth && foot<lenth){
      if (!set.contains(s.charAt(foot))){
        set.add(s.charAt(foot))
        foot+=1
        res = math.max(res, foot-head)
      }else {
        set.remove(s.charAt(head))
        head+=1
      }
    }
    res
  }

参考的优化方案:

java">public int lengthOfLongestSubstring(String s) {
        int n = s.length(), ans = 0;
        Map<Character, Integer> map = new HashMap<>(); // current index of character
        // try to extend the range [i, j]
        for (int j = 0, i = 0; j < n; j++) {
            if (map.containsKey(s.charAt(j))) {
                i = Math.max(map.get(s.charAt(j)), i);
            }
            ans = Math.max(ans, j - i + 1);
            map.put(s.charAt(j), j + 1);
        }
        return ans;
    }
scala">def LongestSubstring2(s:String):Int = {
    var res: Int = 0
    val map:mutable.HashMap[Char,Int] = new mutable.HashMap[Char,Int]
    var head = 0
    var foot = 0
    val lenth = s.length
    while (foot<lenth ){
      if (map.contains(s.charAt(foot))) {
        head = math.max(map(s.charAt(foot)), head)
      }
      res = math.max(res, foot-head+1)
      foot+=1
      map.put(s.charAt(foot-1), foot)
    }
    res
  }

http://www.niftyadmin.cn/n/1214780.html

相关文章

linux下架设dhcp,Linux系统下架设DHCP服务器的方法

1、OS系统版本[rootserver~]#more/etc/redhat-releaseRedHatEnterpriseLinuxASrelease4(NahantUpdate4)2、查看系统是否已经安装DHCP服务端软件[rootserver~]#rpm-qa|grepdhcpdhcpv6_client-0.10-14_EL43、将光盘mount上去&#xff0c;然后安装DHCP服务端软件[rootserver~]#mou…

2008 R2修复光盘_中了后缀.「mr.hacker@tutanota.com」勒索病毒的SQL数据库修复技术

用达思SQL数据库修复软件怎么修复中了后缀.[mr.hackertutanota.com]的勒索病毒加密的数据库&#xff1f;(一卡通综合管理平台)2.33GB的sql数据库被后缀.[mr.hackertutanota.com]加密最近几天有一个一卡通综合管理平台的数据库被勒索病毒加密了&#xff0c;因为整个服务器只有sq…

Android方向传感器

在应用程序中使用SensorManager.getOrientation()来获得原始数据。 public static float[] getOrientation (float[] R, float[] values) 第一个参数是R用来保存磁场和加速度的数据&#xff0c;通过该函数获取方位角。第二个参数是函数输出&#xff0c;数据自动填充。values[0]…

Stale branches 设置_N卡和A卡怎么设置高性能模式|独立显卡怎么设置最佳

显卡默认情况下是不开启高性能模式的&#xff0c;因为除了游戏发烧户&#xff0c;应该很少有用户能用得上这样的一个功能&#xff0c;不过如果大家在运行大型游戏、程序上有点吃力的时候&#xff0c;可以尝试开启显卡的高性能模式&#xff0c;提升体验。这篇文章是系统部落根据…

linux技术咨询,Linux技术咨询委员会已完成对UMN内核漏洞植入事件的调查

此前为了一个处心积虑的 Linux 安全研究项目&#xff0c;两名 UMN 研究人员故意向 Linux 内核插入了有后门漏洞的补丁。事件曝光后&#xff0c;其立即遭到了 Linux 及安全社区的炮轰。最新消息是&#xff0c;由顶级 Linux 内核开发人员组成的 Linux 基金会技术咨询委员会&#…

CF896C Willem, Chtholly and Seniorious(珂朵莉树)

中文题面 珂朵莉树的板子……这篇文章很不错 据说还有奈芙莲树和瑟尼欧里斯树…… 等联赛考完去学一下&#xff08;逃 1 //minamoto2 #include<bits/stdc.h>3 #define IT set<node>::iterator4 #define ll long long5 using namespace std;6 const int mod71e97,mo…

电脑能上网手机连上wifi不能上网_如何通过 iPhone 手机流量给 Windows 电脑上网(不需要 WiFi 接收器、不需要蓝牙)...

很简单&#xff0c;就三个步骤&#xff1a;找一台有网的电脑先下载好 itunes把 itunes 安装到需要上网的 windows 电脑上跟着下面几张图一起操作就好啦~

c语言中srand的作用,C++随机数(rand和srand)函数用法详解

C 提供了一组函数以生成和使用随机数字。随机数字就是从一组可能的值中进行随机选择而获得的一个值。该组中的值都有相同的被选中的几率。随机数字常用于许多不同类型的程序中&#xff0c;以下是一些示例&#xff1a;计算机游戏通常要使用随机数字来模拟一些随机过程&#xff0…