leetcode网-003、无重复字符的最长子串

文章提供了两种Java实现,用于找出字符串中不包含重复字符的最长子串的长度。第一种方法通过遍历不同长度的子串并检查是否有重复来找到最长的;第二种方法使用一个固定大小的数组记录字符出现的位置,优化了时间效率。
摘要由CSDN通过智能技术生成

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

示例 1:

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

示例 2:

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

示例 3:

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

提示:

  • 0 <= s.length <= 5 * 104
  • s 由英文字母、数字、符号和空格组成

java(我写的,不过最后一个用例超时,待优化):

package com.company;

import java.util.HashSet;
import java.util.Scanner;
import java.util.Set;

public class Main2023020903 {
    public static void main(String[] args) {
        Scanner in =new Scanner(System.in);
        String s=in.nextLine();
        System.out.println(lengthOfLongestSubstring(s));
    }
        public static int lengthOfLongestSubstring(String s) {
            //子串长度从大到小遍历,获取最长不重复的子串
            for(int i=s.length();i>0;i--){
                if(lenStr(s,i)!=0){
                    return i;
                }
            }
            return 0;
        }
        //通过长度截取子串
        public static int lenStr(String s,int n){
            for(int i=0;i<s.length()-n+1;i++){
                if(noDup(s.substring(i,n+i))){
                    System.out.println(s.substring(i,n+i));
                    return n;
                }
            }
            return 0;
        }
        //判断子串中不重复
        public static boolean noDup(String str){
            Set<Character> sets=new HashSet<>();
            for(int i=0;i<str.length();i++){
                sets.add(str.charAt(i));
            }
            if(str.length()==sets.size()){
                return true;
            }else{
                return false;
            }
        }

}

java(参考别人写的,比较巧妙):

链接地址:

https://leetcode.cn/problems/longest-substring-without-repeating-characters/comments/

package com.company;

import java.util.Scanner;

public class noDupCharNext {

    public static void main(String[] args){
        Scanner in=new Scanner(System.in);
        while (in.hasNextLine()){
            String str=in.nextLine();
            System.out.println(lengthOfLongestSubstring(str));
        }
    }
    private static int lengthOfLongestSubstring(String s) {
        //定义数组,通过assii码区分每一个字符
        int N=128;
        int index[]=new int[N];
        for(int i=0;i<N;i++){
            index[i]=-1;//初始化字符索引
        }
        int start=0;//坐标
        int res=0;//不重复子串长度
        for(int i=0;i<s.length();i++){
            int x=s.charAt(i);
            //当存在重复字符时,start坐标往后挪移一位
            //当字符不重复时,start坐标不变
            start=Math.max(start,index[x]+1);
            //当存在重复字符时,res值不变
            //当字符不重复时,res取i-start+1(即end坐标-start坐标+1获取子串长度)
            res=Math.max(res,i-start+1);
            //记录每个字符的位置
            index[x]=i;
        }
        return res;
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值