别看了乱取的


私信TA

用户名:ZHC2021

访问量:234

签 名:

我爱学习,更爱不胡思乱想

等  级
排  名 49494
经  验 290
参赛次数 0
文章发表 1
年  龄 0
在职情况 学生
学  校 江门职业技术学院
专  业

  自我简介:

可真帅

TA的其他文章

解题思路:

* 思路:

 * 

 * 整个字符串可以看成很多段无重复的字串重叠拼接而成

 * 只要筛选出最长的字串就可以了

 * 如: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 人评分

  评论区

  • «
  • »