Skip to content

Files

Latest commit

51b11dc · Aug 7, 2024

History

History
This branch is 2 commits ahead of, 266 commits behind doocs/leetcode:main.

2053.Kth Distinct String in an Array

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
Aug 6, 2024
Aug 7, 2024
Aug 6, 2024
Aug 6, 2024
Aug 6, 2024
Aug 6, 2024
Aug 6, 2024
Aug 6, 2024
Aug 6, 2024
comments difficulty edit_url rating source tags
true
简单
1350
第 64 场双周赛 Q1
数组
哈希表
字符串
计数

English Version

题目描述

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

给你一个字符串数组 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] 只包含小写英文字母。

解法

方法一:哈希表 + 计数

我们可以用一个哈希表 cnt 记录每个字符串出现的次数,然后再遍历一次数组,对于每个字符串,如果它出现的次数为 1 ,那么就将 k 减一,直到 k 减为 0 ,返回当前字符串即可。

时间复杂度 O ( L ) ,空间复杂度 O ( L ) ,其中 L 为数组 arr 所有字符串的长度之和。

Python3

class Solution:
    def kthDistinct(self, arr: List[str], k: int) -> str:
        cnt = Counter(arr)
        for s in arr:
            if cnt[s] == 1:
                k -= 1
                if k == 0:
                    return s
        return ""

Java

class Solution {
    public String kthDistinct(String[] arr, int k) {
        Map<String, Integer> cnt = new HashMap<>();
        for (String s : arr) {
            cnt.merge(s, 1, Integer::sum);
        }
        for (String s : arr) {
            if (cnt.get(s) == 1 && --k == 0) {
                return s;
            }
        }
        return "";
    }
}

C++

class Solution {
public:
    string kthDistinct(vector<string>& arr, int k) {
        unordered_map<string, int> cnt;
        for (const auto& s : arr) {
            ++cnt[s];
        }
        for (const auto& s : arr) {
            if (cnt[s] == 1 && --k == 0) {
                return s;
            }
        }
        return "";
    }
};

Go

func kthDistinct(arr []string, k int) string {
	cnt := map[string]int{}
	for _, s := range arr {
		cnt[s]++
	}
	for _, s := range arr {
		if cnt[s] == 1 {
			k--
			if k == 0 {
				return s
			}
		}
	}
	return ""
}

TypeScript

function kthDistinct(arr: string[], k: number): string {
    const cnt = new Map<string, number>();
    for (const s of arr) {
        cnt.set(s, (cnt.get(s) || 0) + 1);
    }
    for (const s of arr) {
        if (cnt.get(s) === 1 && --k === 0) {
            return s;
        }
    }
    return '';
}

Rust

use std::collections::HashMap;

impl Solution {
    pub fn kth_distinct(arr: Vec<String>, mut k: i32) -> String {
        let mut cnt = HashMap::new();

        for s in &arr {
            *cnt.entry(s).or_insert(0) += 1;
        }

        for s in &arr {
            if *cnt.get(s).unwrap() == 1 {
                k -= 1;
                if k == 0 {
                    return s.clone();
                }
            }
        }

        "".to_string()
    }
}

JavaScript

/**
 * @param {string[]} arr
 * @param {number} k
 * @return {string}
 */
var kthDistinct = function (arr, k) {
    const cnt = new Map();
    for (const s of arr) {
        cnt.set(s, (cnt.get(s) || 0) + 1);
    }
    for (const s of arr) {
        if (cnt.get(s) === 1 && --k === 0) {
            return s;
        }
    }
    return '';
};