如题
对比521,难点出现在ad,ab,abc,abc类似的情况,若存在最长字符串重复情况,则需要向下匹配,则先进行排序后从长到短进行判断
public static int findLUSlength(String[] strs) { //从长到短判断,是否有相同字符串,是否存在可匹配更长字符串
List <String> list =sort1(strs); //进行排序
System.out.println(list);
int flag =1; //匹配标志位 1为不存在对应母序列
for(int i=list.size()-1;i>-1;i--) { //从长到短遍历
String str = list.get(i);
for(int m=list.size()-1;m>i;m--) { //当前后一位起遍历
String st= list.get(m);
if(ishas(str,st)) { //判断st是否包含有str
flag=0;
break;
}
}
if(((i>0&&!str.equals(list.get(i-1)))||i==0)&&flag==1) { //i>0时还需判断字符串和i-1处不相同,i=0即为最后一个时无需判断
return str.length();
}
flag =1;
}
return -1;
}
public static boolean ishas(String str1,String str2) { //判断str1是否是str2的子序列
int m=0; //2次循环起点index
int flag=0; //匹配标志位
for(int i =0;i<str1.length();i++) {
for(int n =m;n<str2.length();n++) {
if(str1.charAt(i)==(str2.charAt(n))){ //是否有对应匹配
flag =1; //匹配上
m=n+1; //下次循环起点当为匹配位下一位
break; //匹配上跳出内层循环
}
}
if(flag==0) { //未匹配上则直接返回false
return false;
}
flag =0; //还原匹配标志
}
return true;
}
public static List<String> sort1(String [] strs){ //利用arraylist进行排序
List<String> list = new ArrayList<String>();
for(String str:strs) {
list.add(str);
}
list.sort(new Comparator<String>() {
public int compare(String o1, String o2) {
if(o1.length()<o2.length()) {
return -1;
}else if(o1.length()>o2.length()) {
return 1;
}
return o1.compareTo(o2);
}
});
return list;
}
直来直往,应该是很清晰了,但是结果嘛
emmm,有点丢人,得想想怎么优化。