这篇文章将为大家详细讲解有关java如何求无重复字符的最长子串,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
提示:
0 <= s.length <= 5 * 104 s 由英文字母、数字、符号和空格组成
力扣链接:https://leetcode-cn.com/problems/longest-substring-without-repeating-characters
示例 1:
输入 s = "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:
输入: s = "bbbbb" 输出: 1 解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:
输入: s = "" 输出: 0
/*
String s = "abcabcffhbb";
//string a b c a b c f f h b b
//map 0 1 2 3 4 5 6 7 8 9 10 map记录字符最后一次出现的位置,(a,0)->(a,3)
//[ ] 1 2 3 3 3 3 4 1 2 3 1 记录s.toCharArray()数组对应字符的最大子串长度
*/
class Solution {
public int lengthOfLongestSubstring(String s) {
if(s.length() == 0){
return 0;
}
char[] arr = s.toCharArray();
int len = s.length();
// 记录字符最后一次出现的位置
Map<Character, Integer> map_index = new HashMap<Character, Integer>();
// 记录s.toCharArray()数组对应字符的最大子串长度
int[] distance = new int[len];
map_index.put(arr[0],0);
distance[0] = 1;
int max = 1;
int index;
for(int i=1;i<len;i++) {
// 如果map_index中已经记录了该字符
if (map_index.containsKey(arr[i])) {
// 得到该字符上次出现的下标
index = map_index.get(arr[i]);
// 前一个字符的最长子串+1 与 相同字符的距离进行比较,选择较小值(才没有重复的字符)。
distance[i] = (distance[i-1]+1) < (i - index)?(distance[i] = distance[i-1]+1):(i-index);
}else {
// 前面没有出现该字符直接+1即可
distance[i] = distance[i-1] +1;
}
max = Math.max(max,distance[i]);
map_index.put(arr[i], i);
}
return max;
}
}
使用了数组记录字符串中每个字符对应的最大子串长度,map则是记录某个字符最后一次出现的位置。用前一个字符+1与相同字符的距离进行比较,求出不重复的子串长度。
关于“java如何求无重复字符的最长子串”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。
原文链接:https://my.oschina.net/manner/blog/5052110