最长相邻不相等子序列 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 eachj
where0 < 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 <= 1000
1 <= words[i].length <= 10
1 <= groups[i] <= n
words
consists of distinct strings.words[i]
consists of lowercase English letters.
代码结果
运行时间: 481 ms, 内存: 16.3 MB
/*
* 思路:
* 1. 使用 Java Stream 处理数据。
* 2. 使用 filter 过滤满足条件的组合。
* 3. 使用 collect 收集最终的结果。
*/
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
public class SolutionStream {
public List<String> findLongestSubsequence(int n, String[] words, int[] groups) {
return IntStream.range(0, n)
.boxed()
.flatMap(i -> IntStream.range(i + 1, n)
.filter(j -> isValidPair(words[i], words[j], groups[i], groups[j]))
.mapToObj(j -> new int[]{i, j}))
.map(pair -> new ArrayList<String>() {{
add(words[pair[0]]);
add(words[pair[1]]);
}})
.max((a, b) -> Integer.compare(a.size(), b.size()))
.orElse(new ArrayList<>());
}
private boolean isValidPair(String word1, String word2, int group1, int group2) {
if (group1 == group2 || word1.length() != word2.length()) return false;
int hammingDistance = 0;
for (int i = 0; i < word1.length(); i++) {
if (word1.charAt(i) != word2.charAt(i)) {
hammingDistance++;
}
if (hammingDistance > 1) return false;
}
return hammingDistance == 1;
}
}
解释
方法:
时间复杂度:
空间复杂度: