解题思路:
* 思路:
*
* 整个字符串可以看成很多段无重复的字串重叠拼接而成
* 只要筛选出最长的字串就可以了
* 如: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 人评分
点我有惊喜!你懂得!浏览:4145 |
回文数(一) (C语言代码)浏览:809 |
C语言程序设计教程(第三版)课后习题5.7 (C语言代码)浏览:632 |
C语言程序设计教程(第三版)课后习题8.4 (C语言代码)浏览:628 |
C语言程序设计教程(第三版)课后习题1.6 (C语言代码)浏览:574 |
C语言程序设计教程(第三版)课后习题6.1 (C语言代码)浏览:582 |
C语言训练-数字母 (C语言代码)浏览:648 |
C语言程序设计教程(第三版)课后习题11.5 (C语言代码)浏览:1359 |
C语言程序设计教程(第三版)课后习题3.7 (C语言代码)浏览:587 |
母牛的故事 (java语言代码)浏览:896 |