牛客网编程高频题15——找到字符串的最长无重复字符子串
2021/4/8 12:11:09
本文主要是介绍牛客网编程高频题15——找到字符串的最长无重复字符子串,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
目录
找到字符串的最长无重复字符子串
题目描述
示例1
输入
返回值
示例2
输入
返回值
备注:
方法一:暴力搜索
方法二:链表
方法三:Hashmap
方法四
找到字符串的最长无重复字符子串
题目描述
给定一个数组arr,返回arr的最长无的重复子串的长度(无重复指的是所有数字都不相同)。
示例1
输入
[2,3,4,5]返回值
4
示例2
输入
[2,2,3,4,3]返回值
3
备注:
方法一:暴力搜索
import java.util.*; public class Solution { /** * * @param arr int整型一维数组 the array * @return int整型 */ public int maxLength (int[] arr) { // write code here if(arr.length==1) return 1; int maxlen=1; for (int i = 0; i < arr.length; i++) { HashMap<Integer,Integer> map=new HashMap(); map.put(arr[i],i); int len=1; for (int j = i+1; j < arr.length; j++) { if(map.containsKey(arr[j])){ maxlen=Math.max(maxlen,len); break; }else{ map.put(arr[j],j); len++; } } } return maxlen; } }
时间消耗确实很慢,
方法二:链表
用LinkedList的removeFirst()调整list的长度并记录
例如:{2,3,4,3}遇到重复元素,remove之后是{4,3}
import java.util.*; public class Solution { /** * * @param arr int整型一维数组 the array * @return int整型 */ public int maxLength (int[] arr) { // write code here LinkedList<Integer> list = new LinkedList<>(); int p=0, ans=0; for(int i=0;i<arr.length;i++){ if(list.contains(arr[i])){ int j=list.indexOf(arr[i]); while (j-->=0){ list.removeFirst(); } } list.add(arr[i]); ans=Math.max(ans,list.size()); } return ans; } }
时间和空间消耗都得到了较大的改善,
方法三:Hashmap
import java.util.*; public class Solution { /** * * @param arr int整型一维数组 the array * @return int整型 */ public int maxLength (int[] arr) { // write code here HashMap<Integer,Integer> map = new HashMap<>(); int max = 1; for(int start = 0, end = 0; end<arr.length ; end++){ if(map.containsKey(arr[end])){//重复了 start = Math.max(start, map.get(arr[end])+1); } max = Math.max(max , end-start+1); map.put(arr[end],end); } return max; } }
方法四
该方法最快
import java.util.*; public class Solution { /** * * @param arr int整型一维数组 the array * @return int整型 */ public int maxLength (int[] arr) { // write code here int[] lastPos = new int[100005]; int len = arr.length; int start = 0; int res = 0; for(int i =0;i<len;i++){ int now = arr[i]; start = Math.max(start,lastPos[now]); res = Math.max(res,i-start+1); lastPos[now] = i+1; } return res; } }
这篇关于牛客网编程高频题15——找到字符串的最长无重复字符子串的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-22[开源]10.3K+ Star!轻量强大的开源运维平台,超赞!
- 2024-11-21Flutter基础教程:新手入门指南
- 2024-11-21Flutter跨平台教程:新手入门详解
- 2024-11-21Flutter跨平台教程:新手入门与实践指南
- 2024-11-21Flutter列表组件教程:初学者指南
- 2024-11-21Flutter列表组件教程:新手入门指南
- 2024-11-21Flutter入门教程:初学者必看指南
- 2024-11-21Flutter入门教程:从零开始的Flutter开发指南
- 2024-11-21Flutter升级教程:新手必读的升级指南
- 2024-11-21Flutter升级教程:轻松掌握Flutter版本更新