题解 | #最长特殊子序列(二)#

最长特殊子序列(二)

https://www.nowcoder.com/practice/27f32e4548644ec9a8ee6251d7de30bd

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;
    }
}

全部评论

相关推荐

点赞 评论 收藏
分享
程序员牛肉:主要是因为小厂的资金本来就很吃紧,所以更喜欢有实习经历的同学。来了就能上手。 而大厂因为钱多,实习生一天三四百的就不算事。所以愿意培养你,在面试的时候也就不在乎你有没有实习(除非是同级别大厂的实习。) 按照你的简历来看,同质化太严重了。项目也很烂大街。 要么换项目,要么考研。 你现在选择工作的话,前景不是很好了。
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
07-07 13:46
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务