2053-数组中第 K 个独一无二的字符串

Raphael Liu Lv10

独一无二的字符串 指的是在一个数组中只出现过 一次 的字符串。

给你一个字符串数组 arr 和一个整数 k ,请你返回 arr 中第 k独一无二的字符串 。如果 少于 k
个独一无二的字符串,那么返回 空字符串 ""

注意,按照字符串在原数组中的 顺序 找到第 k 个独一无二字符串。

示例 1:

**输入:** arr = ["d","b","c","b","c","a"], k = 2
**输出:** "a"
**解释:**
arr 中独一无二字符串包括 "d" 和 "a" 。
"d" 首先出现,所以它是第 1 个独一无二字符串。
"a" 第二个出现,所以它是 2 个独一无二字符串。
由于 k == 2 ,返回 "a" 。

示例 2:

**输入:** arr = ["aaa","aa","a"], k = 1
**输出:** "aaa"
**解释:**
arr 中所有字符串都是独一无二的,所以返回第 1 个字符串 "aaa" 。

示例 3:

**输入:** arr = ["a","b","a"], k = 3
**输出:** ""
**解释:**
唯一一个独一无二字符串是 "b" 。由于少于 3 个独一无二字符串,我们返回空字符串 "" 。

提示:

  • 1 <= k <= arr.length <= 1000
  • 1 <= arr[i].length <= 5
  • arr[i] 只包含小写英文字母。

方法一:哈希表

思路与算法

我们可以用哈希表来统计数组 arr 中每种字符串的频数。

统计完成后,我们顺序遍历数组,如果遍历到的字符串在数组中出现频数为 1,则我们将计数 k 减去 1。当上述操作后 k 到达 0 时,对应的字符串即为第 k 个独一无二的字符串,我们返回该字符串作为答案。若遍历完成数组,k 仍未到达 0,则该数组中不存在第 k 个独一无二的字符串,此时我们返回 -1。

代码

[sol1-C++]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class Solution {
public:
string kthDistinct(vector<string>& arr, int k) {
// 维护 arr 中每个字符串的频数
unordered_map<string, int> freq;
for (const string& s: arr){
if (!freq.count(s)){
freq[s] = 0;
}
++freq[s];
}
// 遍历 arr 寻找第 k 个独一无二的字符串
for (const string& s: arr){
if (freq[s] == 1){
--k;
if (k == 0){
return s;
}
}
}
return "";
}
};
[sol1-Python3]
1
2
3
4
5
6
7
8
9
10
11
class Solution:
def kthDistinct(self, arr: List[str], k: int) -> str:
# 维护 arr 中每个字符串的频数
freq = Counter(arr)
# 遍历 arr 寻找第 k 个独一无二的字符串
for s in arr:
if freq[s] == 1:
k -= 1
if k == 0:
return s
return ""

复杂度分析

  • 时间复杂度:O(\sum_i n_i),即数组 arr 中字符串长度总和,其中 n_i 为字符串 arr}[i] 的长度。即为维护频数哈希表和寻找第 k 个独一无二的字符串的时间复杂度。

  • 空间复杂度:O(\sum_i n_i),即为哈希集合的空间开销。

 Comments
On this page
2053-数组中第 K 个独一无二的字符串