import java.util.*;
/**
* NC411 最长特殊子序列(二)
* @author d3y1
*/
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param strs string字符串ArrayList
* @return int整型
*/
public int longestUniqueSubsequence (ArrayList<String> strs) {
return solution(strs);
}
/**
* 贪心
* @param strs
* @return
*/
private int solution(ArrayList<String> strs){
int n = strs.size();
// 排序
// Collections.sort(strs, (o1, o2) -> (o2.length()-o1.length()));
// 此种方式 似乎 效率更高
Collections.sort(strs, new Comparator<String>(){
@Override
public int compare(String o1, String o2){
return o2.length()-o1.length();
}
});
// 哈希
HashMap<String, Integer> map = new HashMap<>();
for(String str: strs){
map.put(str, map.getOrDefault(str, 0)+1);
}
String key;
// 贪心
for(int i=0; i<n; i++){
key = strs.get(i);
// 当前字符串 只有唯一一个
if(map.get(key) == 1){
// 不是前面字符串的子序列
if(!isSubSeq(strs, i)){
return key.length();
}
}
}
return -1;
}
/**
* 判断是否为前面字符串的子序列
* @param strs
* @param idx
* @return
*/
private boolean isSubSeq(ArrayList<String> strs, int idx){
String sub = strs.get(idx);
int subLen = sub.length();
String str;
int strLen;
int cnt;
for(int i=0; i<idx; i++){
str = strs.get(i);
strLen = str.length();
// 长度相等 肯定不是子序列
if(strLen > subLen){
cnt = 0;
// 双指针
for(int j=0,k=0; j<strLen&&k<subLen; j++){
if(str.charAt(j) == sub.charAt(k)){
k++;
cnt++;
}
}
if(cnt == subLen){
return true;
}
}
}
return false;
}
}