首页 > 试题广场 >

找到字符串的最长无重复字符子串

[编程题]找到字符串的最长无重复字符子串
  • 热度指数:3587 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
给定一个数组arr,返回arr的最长无的重复子串的长度(无重复指的是所有字母都不相同)。

输入描述:
输入包含两行,第一行包含一个整数n,代表数组arr的长度,第二行包含n个整数,代表数组arr


输出描述:
输出一个整数,代表arr的最长无重复字符的长度。
示例1

输入

4
2 3 4 5

输出

4
示例2

输入

5
2 2 3 4 3

输出

3

备注:
时间复杂度,额外空间复杂度
双指针滑动窗口求解,刚开始两个指针都在0位置,如果元素一直不重复就扩张右边界,重复了就更新长度并收缩左边界,在这个遍历的过程中使用哈希表来进行判重。
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.util.HashSet;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine());
        String[] strArr = br.readLine().split(" ");
        int[] arr = new int[n];
        for(int i = 0; i < n; i++) arr[i] = Integer.parseInt(strArr[i]);
        int left = 0, right = 0;
        HashSet<Integer> used = new HashSet<>();
        int maxLen = 0;
        while(right < n){
            if(!used.contains(arr[right])){
                used.add(arr[right]);       // 一直不重复就一直扩张右边界
                right++;
            }else{
                // 重复了就更新长度,收缩左边界,直到把第一次出现的重复元素排除掉
                maxLen = Math.max(maxLen, right - left);
                while(left < right && arr[left] != arr[right]){
                    used.remove(arr[left]);
                    left++;
                }
                left++;
                right++;
            }
        }
        maxLen = Math.max(maxLen, right - left);
        System.out.println(maxLen);
    }
}

发表于 2021-11-27 10:36:34 回复(0)
import java.io.*;

public class Main{
    public static int maxUnique(int[] str){
        if(str==null||str.equals("")){
            return 0;
        }
        int[] map=new int[256999];
        for(int i=0;i<256999;i++){
            map[i]=-1;
        }
        int len=0;
        int pre=-1;
        int cur=0;
        for(int i=0;i<str.length;i++){
            pre=Math.max(pre,map[str[i]]);
            cur=i-pre;
            len=Math.max(len,cur);
            map[str[i]]=i;
        }
        return len;
    }
    public static void main(String[] args) throws IOException{
        BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
        int n=Integer.parseInt(br.readLine().trim());
        int[] str = new int[n];
        String[] ops = br.readLine().split(" ");
        for(int i = 0; i < n; i++){
            str[i] = Integer.parseInt(ops[i]);
        }
        System.out.print(maxUnique(str));
    }
}

发表于 2021-03-31 12:01:24 回复(0)

问题信息

上传者:小小
难度:
2条回答 8889浏览

热门推荐

通过挑战的用户

查看代码