首页 > 试题广场 >

无重复字符的最长子串

[编程题]无重复字符的最长子串
  • 热度指数:2667 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解

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


输入描述:

一行一个字符串,长度不超过1000



输出描述:

输出一个数字表示最长子串的长度

示例1

输入

abcabcbb

输出

3

说明

因为无重复字符的最长子串是"abc",所以其长度为3.

import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        Map<Character, Integer> map = new HashMap<>();
        
        String s = in.next();
        int res = 0;
        for (int start = 0, end = 0; end < s.length(); end ++ ) {
            char c = s.charAt(end);
            if (map.containsKey(c)) {
                start = Math.max(start, map.get(c));
            }
            res = Math.max(res, end - start + 1);
            map.put(s.charAt(end), end + 1);
        }
        System.out.println(res);
    }
}


发表于 2022-07-08 15:13:36 回复(0)
import java.util.*;

public class Main{
    public static void main(String[] args){
        
        Map<Character,Integer> map = new HashMap<>();
        Scanner sc = new Scanner(System.in);
        
        String s =sc.next();
        int left =0; int max=0;
        for(int i = 0; i< s.length();i++){
            if(      map.containsKey(    s.charAt(i)   )     ){
                left = Math.max(left, map.get(  s.charAt(i) )+1);
            }
            
            map.put(s.charAt(i),i);
            max = Math.max(max, i - left +1);
        
        }
        
        System.out.println(max);
    }
}

发表于 2022-03-22 09:53:47 回复(1)
public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        while (scanner.hasNext()) {
            String str = scanner.next();
            int answer = getAnswer(str.toCharArray());
            System.out.println(answer);
        }
    }

    public static int getAnswer(char[] str) {
        Map<Character, Integer> lastIndexMap = new HashMap<>(26);
        int answer = 0;
        int tempAnswer = 0;
        for (int i=0; i<str.length; i++) {
            // 1、计算值
            Integer lastIndex = lastIndexMap.get(str[i]);
            if (lastIndex == null) {
                // 如果从未出现过
                tempAnswer += 1;
            } else {
                // 以i-1为Right时候,Left值
                int tempAnswerLeft = i - tempAnswer;
                // 下面判断char[i]是否有在[left, right]中出现过
                if (lastIndex < tempAnswerLeft) {
                    tempAnswer++;
                } else {
                    tempAnswer = i - lastIndex;
                }
            }
            // 2、取最大
            answer = Math.max(answer, tempAnswer);
            // 3、更新lastIndexMap
            lastIndexMap.put(str[i], i);
        }
        return answer;
    }
}
编辑于 2020-12-14 00:06:19 回复(0)

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while(sc.hasNext())
        {
            String inPut = sc.next();
            String ansStr = "";
            int ans = 0;
            String temp = "";
            int temp1 = 0;
            for(int i = 0;i < inPut.length();i ++)
            {
                if(temp.indexOf(inPut.charAt(i)) == -1)
                {
                    temp += inPut.charAt(i);
                    temp1++;
                }else{
                    temp = "";
                    temp1 = 0;
                }
                if(ans < temp1)
                {
                    ans = temp1;
                }
            }
            System.out.println(ans);
        }
    }
}

发表于 2020-07-25 11:22:20 回复(1)