def solution(num, data, input): res = set() # 使用集合来去重 for s in data: if s.startswith(input): res.add(s) # 对结果按字典序排序 res = sorted(res) if not res: return "-1" else: return ",".join(res) test_data1 = ["select", "from", "where", "limit", "origin_log_db", "event_log_table", "user_id", "from_mobile"] test_data2 = ["select", "from", "where", "limit", "group", "having", "in", "index", "inner", "insert", "like", "log_db", "log_table", "user_id", "group_name", "group_id"] print(solution(8, test_data1, "f") == "from,from_mobile") print(solution(16, test_data2, "g") == "group,group_id,group_name") print(solution(16, test_data2, "m") == "-1") 算法思路 初始化结果集合:使用集合 res 来存储符合条件的字符串,集合具有自动去重的特性。 遍历数据:遍历输入的字符串列表 data,对于每一个字符串 s,检查它是否以指定的前缀 input 开始。 添加符合条件的字符串:如果字符串 s 以 input 开头,则将其添加到集合 res 中。 排序结果:将集合 res 转换为列表并对其进行字典序排序。 处理结果: 如果结果集合 res 为空,说明没有符合条件的字符串,返回 -1。 否则,将结果集合 res 中的字符串用逗号连接成一个字符串并返回。 算法分析 时间复杂度 遍历数据:遍历 data 列表,时间复杂度为 O(n),其中 n 是 data 列表的长度。 检查前缀:对于每个字符串 s,检查是否以 input 开头,时间复杂度为 O(m),其中 m 是字符串 s 的平均长度。由于 m 通常较小且固定,可以认为这部分的时间复杂度是常数时间 O(1)(在平均情况下)。 排序:对结果集合 res 进行排序,时间复杂度为 O(k log k),其中 k 是结果集合 res 的大小。在最坏情况下,k = n(即所有字符串都符合条件),因此排序的时间复杂度为 O(n log n)。 综合以上分析,总的时间复杂度为 O(n log n)(由于排序的时间复杂度主导)。 空间复杂度 结果集合:存储符合条件的字符串,空间复杂度为 O(k),其中 k 是结果集合 res 的大小。 排序:排序过程中可能需要额外的空间,空间复杂度为 O(k)(具体取决于排序算法的实现)。 综合以上分析,总的空间复杂度为 O(k),在最坏情况下为 O(n)。 总结 该算法通过遍历输入数据,检查每个字符串是否以指定前缀开始,并使用集合去重,最后对结果进行排序并返回。算法的时间复杂度主要由排序步骤决定,为 O(n log n),空间复杂度在最坏情况下为 O(n)。该算法适用于处理中等规模的数据集,并且能够有效地返回按字典序排序且去重后的符合条件的字符串列表。