leetcode(String)–522 最长特殊序列 II
1,题目:
2,思路:
方法一:
-
先按照字符串的长度降序排序,先从最长的字符串开始找
-
只和长度不小于它的字符串进行比较(这样才可能是子序列)
方法二:
去重+判断是否为子序列
3,代码:
方法一:
class Solution {
public int findLUSlength(String[] strs) {
//先按照字符串的长度降序排序,先从最长的字符串开始找
//只和长度不小于它的字符串进行比较(这样才可能是子序列)
Arrays.sort(strs,(s1,s2)->s2.length()-s1.length());
for(int i=0;i<strs.length;i++){
int j = 0;
boolean sign = true;
while(j<strs.length && strs[j].length()>=strs[i].length()){
if(i==j){
j++;
continue;
}
if(judge(strs[j],strs[i])){
sign = false;
break;
}
j++;
}
if(sign) return strs[i].length();
}
return -1;
}
//判断s2是否是s1的子序列
public boolean judge(String s1,String s2){
int p = 0;
for(char c: s1.toCharArray()){
if(c==s2.charAt(p)) p++;
if(p==s2.length()) return true;
}
return false;
}
}
方法二:
class Solution {
public int findLUSlength(String[] strs) {
HashMap<String, Integer> map = new HashMap<>();
for (String s : strs) {
int value = map.getOrDefault(s, 0);
map.put(s, value + 1);
}
int max = 0;
//存放重复的字符串
HashSet<String> set1 = new HashSet<>();
//存放未重复的字符串
HashSet<String> set2 = new HashSet<>();
for (Map.Entry<String, Integer> entry : map.entrySet()) {
String key = entry.getKey();
int value = entry.getValue();
if (value > 1) {
set1.add(key);
}
else {
set2.add(key);
}
}
for (String s2 : set2) {
int cur = s2.length();
for (String s1 : set1) {
if (isSubsequence(s2, s1)) {
cur = 0;
break;
}
}
max = Math.max(cur, max);
}
return max == 0 ? -1 : max;
}
private boolean isSubsequence(String s2, String s1) {
int index2 = 0, index1 = 0;
while (index2 < s2.length() && index1 < s1.length()) {
if (s2.charAt(index2) == s1.charAt(index1)) {
index2++;
}
index1++;
}
return index2 == s2.length();
}
}