Longest Uncommon Subsequence II

Longest Uncommon Subsequences II

Question:

请添加图片描述

思路

String的题都是不太好理解题在问什么, 这个题呢,找longest uncommon subsequence, 理解一下什么叫uncommon subsequence, 首先就是说, 每一个string 自己就是自己的subsequence.
所以就是说,如果我有一个array of String, 然后其中有一个string长度是最长的, 那么它本身就是longest uncommon subsequence, 因为别的string 都没它长, 所以这个最长的string 不可能是其他任何string 的subsequence. 就满足了longest 和 uncommon.
所以这个题呢, 我们只要先把所有的string 按照长度从大到小排序, 然后先从最长的string 开始往短的string 比较。 如果最长的string就不是其他任何string 的subsequence, 直接就可以return了.
那有些同学可能会说了, 如果最长的先比较了, 那不直接return 最长的string 不就可以了. 不是这样的

首先有可能最长的string 存在duplicate, 那么最长的string 就不是longest uncommon subsequence了.
那么又有同学说了, 既然有可能出现duplicate, 那把duplicate 抹除再return 剩下的最长的不就行了
也不是这样的.
看题目给的example: “aaa”, “aaa”, “aa”
这里面把两个duplicate扔掉之后剩下一个"aa"
此时,“aa” 也是 “aaa"的subsequence, 不是uncommon的. 所以此时如果直接return 了"aa’ 那不就错了.
所以我们即使把duplicate都去掉了, 也需要逐一挨个比较才行。
比较的过程主要是判断小的 string是不是大的string 的subsequence, 就像主要避免"aaa"和“aa"这种情况.

上代码

class Solution {
    public int findLUSlength(String[] strs) {
        Arrays.sort(strs, new Comparator<String>(){
            public int compare(String s1, String s2){
                return s2.length() - s1.length();
            }
        });
        
        for(int i = 0;i < strs.length; ++i){
            boolean flag = true;
            for(int j = 0;j <strs.length; ++j){
                if( i == j) { continue; }
                if(isSubsequence(strs[i], strs[j])) {
                    flag = false;
                    break;
                }
            }
            
            if(flag) {
                return strs[i].length();
            }
        }
        return -1;
    }
    
    private boolean isSubsequence(String s1, String s2){
        if(s2.length() < s1.length()) {return false;}
        else{
            int j = 0;
            for(int i = 0;i < s2.length() && j < s1.length(); ++i){
                if(s1.charAt(j) == s2.charAt(i)){
                    j++;
                }
            }
            return j == s1.length();
        }
    }
    
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值