想法:
由于list集合能存储不重复的对象且有序,利用list.get(i)便可以取出对象。利用这一特性,便可以解决此问题。
代码实现:
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class Javatest {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String str = sc.next();
//由于str.charAt(0)为字符不是字符串,则在后面加上一个""来组成字符串。
String s =str.charAt(0)+"";
//存储不重复的字符串
List<String>list = new ArrayList<>();
for (int i = 0; i <str.length() ; i++) {
for (int j = 0; j <s.length() ; j++) {
if(str.charAt(i)!=str.charAt(j)){
s= s+str.charAt(i);//将不重复的字符连接到一起(+)
}else if(str.charAt(i)==str.charAt(j)) {
list.add(s);//如果遇到重复的字符就将此字符以前的字符串存入集合
//更新左边界,从重复的字符重新开始连接连续的不重复的字符。
s= str.charAt(i)+"";
}else if( i==str.length()-1){
list.add(str.charAt(i)+"");
}
}
}
int max=0;//记录最长的索引
for (int i = 0; i <list.size()-1 ; i++) {
if(list.get(i).length()<list.get(i+1).length()){
max=i+1;
}
}
System.out.println(list.get(max));
}
}
可以举几个例子来推敲。
eg:
" abdcdabgab "
str:a+""
......
str:abdcd,由于后面是a,a已经出现。则将abdcd存入list集合中。
list(0)="abdcd";
更新左边界 s= str.charAt(i)+"";从a+""重新开始。
str=abg,由于a出现了,则将abg存入list集合中.
list(1)="abg";
同理:
list(2)="ab";
比较长度。