原题链接:最长不含重复字符的子字符串
解题思路:
* 思路:
*
* 整个字符串可以看成很多段无重复的字串重叠拼接而成
* 只要筛选出最长的字串就可以了
* 如:asdfgdfg 字串是:asdfg,fgd,gdf,dfg
*
* 采用队列思想
* 1.把字符串变成数组,然后一个一个放进队列里,
* 2.放进去的同时比较队列里除了自身之外有没有相同的字符,
* 3.有则把队列开头到相同字符这个位置从队列里剔除,然后后面的字符往前走,形成新队列,记录长度
* 4.无则直接记录长度
* 5.每记录一次就把最大长度的留下来,最后直接输出。
*
*
* 如:输入asdfghjklgk
* 队列asdfghjkl这里没有重复,而当把g放进去的时候就重复了,此时队列是asdfghjklg
* 根据第3步,队列a--g这一块从队列剔除,后面的补上,得到新队列hjklg,记录长度
* 如此重复即可。
*
注意事项:
参考代码:
import java.util.Arrays;
import java.util.Scanner;
public class Main{
static int max;//记录长度
//查询是否有重复
public static String[] fun1(String A[],String s,int x) {
if(x>0) {
int a=0;//用来判断是否存在重复
for(int i=0;i<x;i++) {
if(A[i].equals(s)) {
a=1;
A=fun2(A,i,x);
max=x-i;
break;
}
}
if(a==0) {
max=x+1;
}
}else {
max=1;
}
return A;
}
//队列---数据往前走
public static String[] fun2(String A[],int start,int end) {
int length=end-start;//length是新队列长度
int a=start+1;
for(int i=0;i<end+1;i++) {
if(i<length+1) {
A[i]=A[start+1];
start++;
}else {
A[i]=null;
}
}
return A;
}
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String s = in.next();
String S[] = s.split("");
//设置一个队列A,长度为26
String A[] = new String[26];
//设置一个数用来表示A数组有效值长度
int x=0;
//设置一个MAX用来记录最大长度
int MAX=0;
for(int i=0;i<S.length;i++) {
//数据放进去
A[x]=S[i];
//查询后得到新队列
A=fun1(A,S[i],x);
//更新队列长度
if(max>MAX)MAX=max;
x=max;//!!!!!!!!注意,此时的x是新队列的长度
}
System.out.println(MAX);
}
}0.0分
1 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复