问题背景
给你一个下标从 0 0 0 开始的字符串数组 w o r d s words words,和一个下标从 0 0 0 开始的 二进制 数组 g r o u p s groups groups,两个数组长度都是 n n n。
你需要从 w o r d s words words 中选出 最长子序列。如果对于序列中的任何两个连续串,二进制数组 g r o u p s groups groups 中它们的对应元素不同,则 w o r d s words words 的子序列是不同的。
正式来说,你需要从下标 [ 0 , 1 , . . . , n − 1 ] [0, 1, ..., n - 1] [0,1,...,n−1] 中选出一个 最长子序列 ,将这个子序列记作长度为 k k k 的 [ i 0 , i 1 , . . . , i k − 1 ] [i_0, i_1, ..., i_{k - 1}] [i0,i1,...,ik−1],对于所有满足 0 ≤ j < k − 1 0 \le j < k - 1 0≤j<k−1 的 j j j 都有 g r o u p s [ i j ] ≠ g r o u p s [ i j + 1 ] groups[i_j] \ne groups[i_j + 1] groups[ij]=groups[ij+1]。
请你返回一个字符串数组,它是下标子序列 依次 对应 w o r d s words words 数组中的字符串连接形成的字符串数组。如果有多个答案,返回 任意 一个。
注意: w o r d s words words 中的元素是不同的 。
数据约束
- 1 ≤ n = w o r d s . l e n g t h = g r o u p s . l e n g t h ≤ 100 1 \le n = words.length = groups.length \le 100 1≤n=words.length=groups.length≤100
- 1 ≤ w o r d s [ i ] . l e n g t h ≤ 10 1 \le words[i].length \le 10 1≤words[i].length≤10
- g r o u p s [ i ] groups[i] groups[i] 是 0 0 0 或 1 1 1。
- w o r d s words words 中的字符串 互不相同 。
- w o r d s [ i ] words[i] words[i] 只包含小写英文字母。
解题过程
这题实际上是一个分组问题,将所有连续相同的字符看作是一组,每一组中只选择一个就可以保证相同组的元素不连续出现。
具体实现
class Solution {public List<String> getLongestSubsequence(String[] words, int[] groups) {List<String> res = new ArrayList<>();int n = groups.length;for (int i = 0; i < n; i++) {if (i == n - 1 || groups[i] != groups[i + 1]) {res.add(words[i]);}}return res;}
}