Problem Statement :
Given an array of strings strs, return the length of the longest uncommon subsequence between them. If the longest uncommon subsequence does not exist, return -1.
An uncommon subsequence between an array of strings is a string that is a subsequence of one string but not the others.
A subsequence of a string s is a string that can be obtained after deleting any number of characters from s.
For example, "abc" is a subsequence of "aebdc" because you can delete the underlined characters in "aebdc" to get "abc". Other subsequences of "aebdc" include "aebdc", "aeb", and "" (empty string).
Test Cases :
Example 1:
Input: strs = ["aba","cdc","eae"]
Output: 3
Example 2:
Input: strs = ["aaa","aaa","aa"]
Output: -1
Constraints :
1 <= strs.length <= 50
1 <= strs[i].length <= 10
strs[i] consists of lowercase English letters.
Approach :
1) We will be sorting the string array in the reverse order based on the each string length.
Arrays.sort(strs, (s1, s2) -> Integer.compare(s2.length(), s1.length()));
2) Then we will be finding the duplicates present inside the array. If there are no duplicate, then the answer will be the length of largest string.
public Set<String> findDuplicate(String [] strs) {
Set<String> store = new HashSet<>();
Set<String> duplicate = new HashSet<>();
for (String s : strs) {
if (store.contains(s)) {
duplicate.add(s);
}
else {
store.add(s);
}
}
return duplicate;
}
3) Now check the other string that are not duplicate and skip which are subsequence.
4) If a string is not duplicate and i == 0, then that strings length is the answer what we are looking for.
5) Else we check this string with other strings and check whether it is a subsequence. If a subsequence then we will be skipping, otherwise if j == i - 1, then that strings length will be our answer.
for (int i=0; i<strs.length; i++) {
if (!duplicates.contains(strs[i])) {
if (i == 0)
return strs[i].length();
for (int j=0; j<i; j++) {
if (isSubsequence(strs[j], strs[i]))
break;
if (j == i - 1)
return strs[i].length();
}
}
}
return -1;
}
public boolean isSubsequence(String s1, String s2) {
int i = 0;
int j = 0;
while (i < s1.length() && j < s2.length()) {
if (s1.charAt(i) == s2.charAt(j)) {
j++;
}
i++;
}
return j == s2.length();
}
Final Code :
class Solution {
public int findLUSlength(String[] strs) {
if (strs == null || strs.length == 0)
return -1;
// 1. sort in reversing order
Arrays.sort(strs, (s1, s2) -> Integer.compare(s2.length(), s1.length()));
// 2. Find the duplicates if any
// if no duplicates then the longest string is the answer
Set<String> duplicates = findDuplicate(strs);
if (duplicates.size() == 0) {
return strs[0].length();
}
// check for other strings that are not duplicate
// skip which are common
for (int i=0; i<strs.length; i++) {
if (!duplicates.contains(strs[i])) {
if (i == 0)
return strs[i].length();
for (int j=0; j<i; j++) {
if (isSubsequence(strs[j], strs[i]))
break;
if (j == i - 1)
return strs[i].length();
}
}
}
return -1;
}
public boolean isSubsequence(String s1, String s2) {
int i = 0;
int j = 0;
while (i < s1.length() && j < s2.length()) {
if (s1.charAt(i) == s2.charAt(j)) {
j++;
}
i++;
}
return j == s2.length();
}
public Set<String> findDuplicate(String [] strs) {
Set<String> store = new HashSet<>();
Set<String> duplicate = new HashSet<>();
for (String s : strs) {
if (store.contains(s)) {
duplicate.add(s);
}
else {
store.add(s);
}
}
return duplicate;
}
}
Time and Space Complexity :
Time - O(n ^ 2) where n is the length of array
Space - O(n) where we are making use of extra set to note the duplicates
LeetCode
LeetCode problems that are solved.
-
take the bit of the ith(from right) digit:
bit = (mask >> i) & 1;
-
set the ith digit to 1: mask = mask | (1 << i);
-
set the ith digit to 0: mask = mask & (~(1 << i));
Top comments (0)