3142. Longest Unequal Adjacent Groups Subsequence Ii¶
Difficulty: Medium
LeetCode Problem View on GitHub
3142. Longest Unequal Adjacent Groups Subsequence II
Medium
You are given a string array words, and an array groups, both arrays having length n.
The hamming distance between two strings of equal length is the number of positions at which the corresponding characters are different.
You need to select the longest subsequence from an array of indices [0, 1, ..., n - 1], such that for the subsequence denoted as [i0, i1, ..., ik-1] having length k, the following holds:
- For adjacent indices in the subsequence, their corresponding groups are unequal, i.e.,
groups[ij] != groups[ij+1], for eachjwhere0 < j + 1 < k. words[ij]andwords[ij+1]are equal in length, and the hamming distance between them is1, where0 < j + 1 < k, for all indices in the subsequence.
Return a string array containing the words corresponding to the indices (in order) in the selected subsequence. If there are multiple answers, return any of them.
Note: strings in words may be unequal in length.
Example 1:
Input: words = ["bab","dab","cab"], groups = [1,2,2]
Output: ["bab","cab"]
Explanation: A subsequence that can be selected is [0,2].
groups[0] != groups[2]words[0].length == words[2].length, and the hamming distance between them is 1.
So, a valid answer is [words[0],words[2]] = ["bab","cab"].
Another subsequence that can be selected is [0,1].
groups[0] != groups[1]words[0].length == words[1].length, and the hamming distance between them is1.
So, another valid answer is [words[0],words[1]] = ["bab","dab"].
It can be shown that the length of the longest subsequence of indices that satisfies the conditions is 2.
Example 2:
Input: words = ["a","b","c","d"], groups = [1,2,3,4]
Output: ["a","b","c","d"]
Explanation: We can select the subsequence [0,1,2,3].
It satisfies both conditions.
Hence, the answer is [words[0],words[1],words[2],words[3]] = ["a","b","c","d"].
It has the longest length among all subsequences of indices that satisfy the conditions.
Hence, it is the only answer.
Constraints:
1 <= n == words.length == groups.length <= 10001 <= words[i].length <= 101 <= groups[i] <= nwordsconsists of distinct strings.words[i]consists of lowercase English letters.
Solution¶
class Solution {
private List<String> ans;
private int dp[][];
public List<String> getWordsInLongestSubsequence(String[] words, int[] groups) {
int n = words.length;
dp = new int[n + 1][n + 1];
for (int current[] : dp) Arrays.fill(current, -1);
int res = solve(0, -1, groups, words);
build_answer(words, groups);
return ans;
}
private int solve(int ind, int prev, int groups[], String words[]) {
if (ind >= words.length) return 0;
if (dp[ind][prev + 1] != -1) return dp[ind][prev + 1];
if (prev == -1) {
int op1 = Integer.MIN_VALUE / 10, op2 = Integer.MIN_VALUE / 10;
op1 = 1 + solve(ind + 1, ind, groups, words);
op2 = solve(ind + 1, prev, groups, words);
return dp[ind][prev + 1] = Math.max(op1, op2);
}
else {
int op1 = Integer.MIN_VALUE / 10, op2 = Integer.MIN_VALUE / 10;
if (check(words[ind], words[prev]) == 1 && groups[ind] != groups[prev]) {
op1 = 1 + solve(ind + 1, ind, groups, words);
}
op2 = solve(ind + 1, prev, groups, words);
return dp[ind][prev + 1] = Math.max(op1, op2);
}
}
private void build_answer(String words[], int groups[]) {
int n = words.length;
ans = new ArrayList<>();
int ind = 0, prev = -1;
while (ind < n) {
int take = -1, not_take = dp[ind + 1][prev + 1];
if (prev == -1) {
take = 1 + dp[ind + 1][ind + 1];
}
else if (groups[prev] != groups[ind] && check(words[prev], words[ind]) == 1) {
take = 1 + dp[ind + 1][ind + 1];
}
if (take > not_take) {
ans.add(words[ind]);
prev = ind;
}
ind++;
}
}
private int check(String s, String t) {
if (s.length() != t.length()) return 0;
int count = 0;
for (int i = 0; i < s.length(); i++) {
if (s.charAt(i) != t.charAt(i)) count++;
}
if (count == 1) return 1;
return 0;
}
}
Complexity Analysis¶
- Time Complexity:
O(?) - Space Complexity:
O(?)
Approach¶
Detailed explanation of the approach will be added here