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;
                }
            }else{
                break;
            }
        }

        return false;
    }
}