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