一、题目:给定一个字符串,请你找出其中不含有重复字符的最长子串的长度
示例: 输入:"abcabcb" 输出:3 因为无重复的最长子串是"abc"
二、代码
主要的思想就是滑动窗口,减少查找的开销
import java.util.Scanner;
public class Tran1 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String str = sc.next();
System.out.println(LengthOfLongestSubstring(str));
}
//技巧:滑动窗口
static int LengthOfLongestSubstring(String s) { //这个函数是题目要求实现的函数
int left = 0; //左窗口
int right = 0; //右窗口
int maxLen = 0; //最大长度
if (s.length() > 0) { //可能会有空串
maxLen = 1;
}
for (right = 1;right < s.length(); right++) {
char c = s.charAt(right); //拿到当前字符
int res = FindCharFromSubstring(s,left,right-1,c); //去left到right-1这个串去找
if (res != -1) { //找到了,说明有重复
left = res + 1; //left右移到重复字符的下一个位置
}
maxLen = Math.max(maxLen,right - left + 1);
}
return maxLen;
}
static int FindCharFromSubstring(String s, int l, int r, char c) { //这个函数是自己编写的
for (int i = l;i < r; i++) {
if (s.charAt(i) == c) {
return i;
}
}
return -1;
}
}
欢迎大家一起交流!Java全套学习资料的电子版,免费分享给大家,关注我的公众号,菜单栏–>技术相关–>免费资源即可领取,还有网课查答案,包括学习通、智慧树、mooc,内容涵盖计算机、政治等等,还有其他免费资源(简历模板、电子版书籍和考试资料等等),说不准大家会有用(分享干货)!
扫码加关注吧!