
2026-06-11:前缀连接组的数目。用go语言,给你一个字符串数组 words 和一个整数 k。 如果两个来自不同位置的单词 a、b 满足:它们从开头开始的前 k 个字符完全相同(即 a 的前 k 位等于 b 的前 k 位),那么称这两个单词“可前缀连接”。
一个“连接组”指由一些单词组成的集合,并且集合中的任意两两个单词都两两满足“可前缀连接”。
要求你统计:在给定的 words 中,能形成的、包含至少两个单词的连接组的数量。
注意:长度少于 k 的单词无法提供有效前 k 位前缀,因此必须忽略。即使字符串内容重复,也算作不同的单词。
1 <= words.length <= 5000。
1 <= words[i].length <= 100。
1 <= k <= 100。
words 中的所有字符串均由小写英文字母组成。
输入: words = ["apple","apply","banana","bandit"], k = 2。
输出: 2。
解释:
共享相同前 k = 2 个字母的单词被分为一组:
words[0] = "apple" 和 words[1] = "apply" 共享前缀 "ap"。
words[2] = "banana" 和 words[3] = "bandit" 共享前缀 "ba"。
因此,共有 2 个连接组,每个组至少包含两个单词。
题目来自力扣3839。
创建一个空的哈希映射(字典),作用是:键 = 有效前缀(前k个字符),值 = 该前缀出现的单词数量。 同时定义一个结果变量,初始值为0,用于记录最终符合条件的连接组数量。
逐个处理字符串数组中的每一个单词,执行以下操作:
apple:长度5≥2,提取前缀ap,映射中ap:1;apply:长度5≥2,提取前缀ap,映射中ap:2;banana:长度6≥2,提取前缀ba,映射中ba:1;bandit:长度6≥2,提取前缀ba,映射中ba:2。最终哈希映射结果:ap:2、ba:2。
连接组的定义:包含至少两个单词的前缀组。 因此我们遍历哈希映射中的所有计数值:
ap计数=2>1 → 结果+1(结果=1);ba计数=2>1 → 结果+1(结果=2)。最终结果为2,与题目示例输出一致。
我们分两步计算核心操作的时间:
n个单词(n是words的长度,最大5000),每个单词截取前k个字符的操作是O(k),总耗时O(n*k);n(所有前缀都不重复),遍历耗时O(n)。综合来看,总时间复杂度为 O(n * k)。
额外空间指除了输入数据外,程序运行时开辟的内存空间:
n个键值对;O(1)。因此,总额外空间复杂度为 O(n)。
.
package main
import (
"fmt"
)
func prefixConnected(words []string, k int) (ans int) {
cnt := map[string]int{}
for _, w := range words {
iflen(w) >= k {
cnt[w[:k]]++
}
}
for _, c := range cnt {
if c > 1 {
ans++
}
}
return
}
func main() {
words := []string{"apple", "apply", "banana", "bandit"}
k := 2
result := prefixConnected(words, k)
fmt.Println(result)
}

.
# -*-coding:utf-8-*-
def prefixConnected(words, k):
cnt = {}
for w in words:
iflen(w) >= k:
prefix = w[:k]
cnt[prefix] = cnt.get(prefix, 0) + 1
ans = 0
for c in cnt.values():
if c > 1:
ans += 1
return ans
if __name__ == "__main__":
words = ["apple", "apply", "banana", "bandit"]
k = 2
result = prefixConnected(words, k)
print(result)
.
#include <iostream>
#include <vector>
#include <string>
#include <unordered_map>
using namespace std;
int prefixConnected(vector<string>& words, int k) {
unordered_map<string, int> cnt;
for (conststring& w : words) {
if (w.length() >= k) {
string prefix = w.substr(0, k);
cnt[prefix]++;
}
}
int ans = 0;
for (const auto& pair : cnt) {
if (pair.second > 1) {
ans++;
}
}
return ans;
}
int main() {
vector<string> words = {"apple", "apply", "banana", "bandit"};
int k = 2;
int result = prefixConnected(words, k);
cout << result << endl;
return0;
}

我们相信人工智能为普通人提供了一种“增强工具”,并致力于分享全方位的AI知识。在这里,您可以找到最新的AI科普文章、工具评测、提升效率的秘籍以及行业洞察。