算法题精讲-leetcode3-给定字符串中无重复字符的最长子串
程序员文章站
2022-05-12 22:18:54
...
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
例如:
输入:"afashuih"
输出:5
最长字串为:"fashui"
解法一:写着很简单,但是jvm运行起来在骂娘的写法
解题思路:将随给字符串拆分为若干子字符串,逐一判断所有子字符串是否字符唯一,记录字符唯一的子字符串中最长的一个的长度
//大体思路:将随给字符串拆分为若干子字符串,逐一判断所有子字符串是否字符唯一,记录字符唯一的子字符串中最长的一个的长度
public class TestDemo {
public static void main(String[] args) {
//所需要判断的字符串
String str = "afashuih";
int strLength = str.length();
//记录 字符唯一的 最长的 子字符串
int result = 0;
//两层循环截取所有可能的子字符串
for(int i = 0; i < strLength; i++){
for(int j = i + 1; j <= strLength; j++){
//if中判断该子字符串是否字符唯一
if(chiledStrUnique(str,i,j)){
//将当前子字符串的长度与result做比较
result = Math.max(result, j - i);
}
}
}
System.out.println("当前需要判断的字符串为"+ str);
System.out.println("无重复字符的最长子串的长度为"+ result);
}
//param(所给字符串, 子字符串从哪开始, 子字符串从哪结束)
private static boolean chiledStrUnique(String str, int start, int end){
// 保存子字符串字符,hash结构查找更快,时间复杂度为O(1),所以不用链表结构或数组结构
Set<Character> set = new HashSet<>();
for(int i = start; i<end; i++){
char c = str.charAt(i);
if(set.contains(c)){
return false;
}else{
set.add(c);
}
}
return true;
}
}
解法二:通过滑动窗口来实现
解题思路:遍历所给字符串,滑动窗口中保存当前没有重复字符的区间,滑动窗口长度的最大值就是最终结果。
滑动窗口【i,j记录滑动窗口的区间大小,j - i + 1 = 滑动窗口长度】:
图解:
滑动窗口的最大长度为6,则结果为6.
代码:
public class TestDemo {
public static void main(String[] args) {
String str = "afashuih";
Integer ans = slidingWindow(str);
System.out.println("当前需要判断的字符串为"+ str);
System.out.println("无重复字符的最长子串的长度为"+ans);
}
private static Integer slidingWindow(String str) {
//记录所给字符串长度
int n = str.length();
//初始化返回结果0
int ans = 0;
//map中保存所有遍历到的字符,如果存在重复字符,仅保存最后出现的字符
Map<Character, Integer> map = new HashMap<>();
for (int i = 0, j = 0; j<n; j++){
char c = str.charAt(j);
boolean flag = map.containsKey(c);
if (flag){
//注意此处需要判断之前的i有没有被跳过去,不能直接写成: i = map.get(c);
i = map.get(c) > i ? map.get(c) : i;
}
//将当前遍历到的字符放入map中
map.put(c, j + 1);
ans = Math.max(j - i + 1, ans);
}
return ans;
}
}
▄█▀█●各位同仁,如果我的代码对你有帮助,请给我一个赞吧,为了下次方便找到,也可关注加收藏呀
如果有什么意见或建议,也可留言区讨论
上一篇: 做什么网站赚钱?我为大家推荐这几种