2901. Longest Unequal Adjacent Groups Subsequence II LeetCode Solution
In this guide, you will get 2901. Longest Unequal Adjacent Groups Subsequence II LeetCode Solution with the best time and space complexity. The solution to Longest Unequal Adjacent Groups Subsequence II problem is provided in various programming languages like C++, Java, and Python. This will be helpful for you if you are preparing for placements, hackathons, interviews, or practice purposes. The solutions provided here are very easy to follow and include detailed explanations.
Table of Contents
- Problem Statement
- Complexity Analysis
- Longest Unequal Adjacent Groups Subsequence II solution in C++
- Longest Unequal Adjacent Groups Subsequence II solution in Java
- Longest Unequal Adjacent Groups Subsequence II solution in Python
- Additional Resources

Problem Statement of Longest Unequal Adjacent Groups Subsequence II
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 each j where 0 < j + 1 < k.
words[ij] and words[ij+1] are equal in length, and the hamming distance between them is 1, where 0 < 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 is 1.
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 <= 1000
1 <= words[i].length <= 10
1 <= groups[i] <= n
words consists of distinct strings.
words[i] consists of lowercase English letters.
Complexity Analysis
- Time Complexity: O(n^2 \cdot \texttt{words[i]})
- Space Complexity: O(n)
2901. Longest Unequal Adjacent Groups Subsequence II LeetCode Solution in C++
class Solution {
public:
vector<string> getWordsInLongestSubsequence(int n, vector<string>& words,
vector<int>& groups) {
vector<string> ans;
// dp[i] := the length of the longest subsequence ending in `words[i]`
vector<int> dp(n, 1);
// prev[i] := the best index of words[i]
vector<int> prev(n, -1);
for (int i = 1; i < n; ++i)
for (int j = 0; j < i; ++j) {
if (groups[i] == groups[j])
continue;
if (words[i].length() != words[j].length())
continue;
if (hammingDist(words[i], words[j]) != 1)
continue;
if (dp[i] < dp[j] + 1) {
dp[i] = dp[j] + 1;
prev[i] = j;
}
}
// Find the last index of the subsequence.
int index = ranges::max_element(dp) - dp.begin();
while (index != -1) {
ans.push_back(words[index]);
index = prev[index];
}
ranges::reverse(ans);
return ans;
}
private:
int hammingDist(const string& s1, const string& s2) {
int dist = 0;
for (int i = 0; i < s1.length(); ++i)
if (s1[i] != s2[i])
++dist;
return dist;
}
};
/* code provided by PROGIEZ */
2901. Longest Unequal Adjacent Groups Subsequence II LeetCode Solution in Java
class Solution {
public List<String> getWordsInLongestSubsequence(int n, String[] words, int[] groups) {
List<String> ans = new ArrayList<>();
// dp[i] := the length of the longest subsequence ending in `words[i]`
int[] dp = new int[n];
Arrays.fill(dp, 1);
// prev[i] := the best index of words[i]
int[] prev = new int[n];
Arrays.fill(prev, -1);
for (int i = 1; i < n; ++i)
for (int j = 0; j < i; ++j) {
if (groups[i] == groups[j])
continue;
if (words[i].length() != words[j].length())
continue;
if (hammingDist(words[i], words[j]) != 1)
continue;
if (dp[i] < dp[j] + 1) {
dp[i] = dp[j] + 1;
prev[i] = j;
}
}
// Find the last index of the subsequence.
int index = getMaxIndex(dp);
while (index != -1) {
ans.add(words[index]);
index = prev[index];
}
Collections.reverse(ans);
return ans;
}
private int hammingDist(final String s1, final String s2) {
int dist = 0;
for (int i = 0; i < s1.length(); ++i)
if (s1.charAt(i) != s2.charAt(i))
++dist;
return dist;
}
private int getMaxIndex(int[] dp) {
int maxIndex = 0;
for (int i = 0; i < dp.length; ++i)
if (dp[i] > dp[maxIndex])
maxIndex = i;
return maxIndex;
}
}
// code provided by PROGIEZ
2901. Longest Unequal Adjacent Groups Subsequence II LeetCode Solution in Python
class Solution:
def getWordsInLongestSubsequence(
self,
n: int,
words: list[str],
groups: list[int],
) -> list[str]:
ans = []
# dp[i] := the length of the longest subsequence ending in `words[i]`
dp = [1] * n
# prev[i] := the best index of words[i]
prev = [-1] * n
for i in range(1, n):
for j in range(i):
if groups[i] == groups[j]:
continue
if len(words[i]) != len(words[j]):
continue
if sum(a != b for a, b in zip(words[i], words[j])) != 1:
continue
if dp[i] < dp[j] + 1:
dp[i] = dp[j] + 1
prev[i] = j
# Find the last index of the subsequence.
index = dp.index(max(dp))
while index != -1:
ans.append(words[index])
index = prev[index]
return ans[::-1]
# code by PROGIEZ
Additional Resources
- Explore all LeetCode problem solutions at Progiez here
- Explore all problems on LeetCode website here
Happy Coding! Keep following PROGIEZ for more updates and solutions.