核心代码编程-文档特征提取-100分
题目描述一篇文档由多个文本片段组成这里假定每个片段由小写英文字母组成不包含其他内容需要针对该文档的多个片段进行特征提取提取方法如下1、特征提取处理时首先找出所有片段中都包含的字母也就是该字母在所有片段中都至少出现过一次。2、如果某个字母在多个片段中都出现过则计算字母在所有片段中出现的最小次数如果最小次数为1则特征中包含1个该字母如果最少次数为2则特征中包含2个该字母以此类推。3、最终输出的文本特征是具备上诉条件所有字母的集合且字母接照从小到大排序。4、如果所有的字母都不符合该条件则提取特征的结果为空。请编写一个函数接收一组字符串即所有片段 docs作为输入计算并返回特征。补充说明用例中字符串即片段的总数小于1000个-------------------------------------------------------示例1输入[paper, parent, parade]输出aepr说明·p, a, e,r在每个字符串中都至少出现一次每个字母在各字符中都至少出现1次所以结果中每个字母出现1次示例2输入 [hello, hollow, halloween]输出 hllo说明·h在每个字串中都至少出现1次→取最小值1次·I在三个字符串中分别出现2次、2次、2次 → 最小值2次·o在三个字符串中分别出现1次、2次、1次 → 最小值1次·所以结果是h, I, I, o]示例3输入 [abc,def,ghi]输出说明没有字母在所有三个字符串中都出现为了解决这个问题我们需要实现一个函数该函数接收一组字符串文档片段作为输入并返回按规则提取的特征字符串。以下是完整的实现思路和代码算法思路找出公共字母首先确定所有输入字符串中都出现的字母集合。计算最小出现次数对于每个公共字母计算它在所有字符串中出现次数的最小值。构建特征字符串根据最小出现次数将每个字母重复相应次数最后按字母顺序排序并连接成字符串。处理边界情况如果没有公共字母返回空字符串。代码实现Pythondef extract_feature(docs): if not docs: return # 找出所有字符串中都出现的公共字母 common_chars set(docs[0]) for s in docs[1:]: common_chars common_chars set(s) # 如果没有公共字母返回空字符串 if not common_chars: return # 预计算每个字符串的字符频率 freq_list [] for s in docs: freq {} for char in s: freq[char] freq.get(char, 0) 1 freq_list.append(freq) # 按字母顺序处理公共字母 sorted_common sorted(common_chars) result_chars [] for char in sorted_common: min_count min(freq[char] for freq in freq_list) result_chars.extend([char] * min_count) return .join(result_chars)代码说明公共字母计算初始化common_chars为第一个字符串的字母集合。遍历后续字符串通过集合交集操作逐步缩小公共字母集合。字符频率预计算为每个字符串构建一个字典freq记录每个字母的出现次数。频率字典存储在列表freq_list中。特征构建公共字母按字母顺序排序。对每个字母计算它在所有字符串中出现次数的最小值min_count。将字母重复min_count次加入结果列表。结果生成使用.join()将结果列表连接成字符串返回。边界处理输入为空列表时直接返回空字符串。无公共字母时返回空字符串。示例验证示例1[paper, parent, parade]→ 输出aepr示例2[hello, hollow, halloween]→ 输出hllo示例3[abc,def,ghi]→ 输出此实现满足题目要求时间复杂度为 $O(N \times L 26 \times N)$其中 $N$ 是字符串数量$L$ 是字符串平均长度高效处理了所有边界情况。-------20:00添加算法分析需要实现的特征提取算法分为三个步骤筛选公共字母找出所有文档片段中都出现的字母计算最小频次对每个公共字母计算其在所有片段中出现次数的最小值构建特征字符串按最小频次重复字母并按字典序排序时间复杂度$O(n \times k)$其中 $n$ 是片段数量$k$ 是字母表大小26代码实现Pythondef extract_feature(docs): if not docs: return common_letters set(docs[0]) for s in docs[1:]: common_letters set(s) if not common_letters: return res [] for char in sorted(common_letters): min_count min(s.count(char) for s in docs) res.append(char * min_count) return .join(sorted(.join(res)))C#include vector #include string #include algorithm #include climits using namespace std; string extractFeature(vectorstring docs) { if (docs.empty()) return ; vectorint common(26, 1); for (string s : docs) { vectorint cnt(26, 0); for (char c : s) cnt[c - a]; for (int i 0; i 26; i) common[i] min(common[i], cnt[i]); } string res; for (int i 0; i 26; i) { if (common[i] 0) res string(common[i], a i); } sort(res.begin(), res.end()); return res; }JavaScriptfunction extractFeature(docs) { if (docs.length 0) return ; let common new Set(docs[0]); for (let i 1; i docs.length; i) { common new Set([...common].filter(c docs[i].includes(c))); } if (common.size 0) return ; let res []; [...common].sort().forEach(char { let minCount Math.min(...docs.map(s [...s].filter(c c char).length)); res.push(char.repeat(minCount)); }); return res.join().split().sort().join(); }Javaimport java.util.*; public class FeatureExtractor { public static String extractFeature(String[] docs) { if (docs.length 0) return ; SetCharacter common new HashSet(); for (char c : docs[0].toCharArray()) common.add(c); for (int i 1; i docs.length; i) { SetCharacter set new HashSet(); for (char c : docs[i].toCharArray()) set.add(c); common.retainAll(set); } if (common.isEmpty()) return ; ListCharacter resList new ArrayList(); ListCharacter sorted new ArrayList(common); Collections.sort(sorted); for (char c : sorted) { int minCount Integer.MAX_VALUE; for (String s : docs) { int cnt 0; for (char ch : s.toCharArray()) if (ch c) cnt; minCount Math.min(minCount, cnt); } for (int i 0; i minCount; i) resList.add(c); } Collections.sort(resList); StringBuilder sb new StringBuilder(); for (char c : resList) sb.append(c); return sb.toString(); } }Gofunc extractFeature(docs []string) string { if len(docs) 0 { return } common : make(map[rune]bool) for _, c : range docs[0] { common[c] true } for _, s : range docs[1:] { temp : make(map[rune]bool) for _, c : range s { if common[c] { temp[c] true } } common temp } if len(common) 0 { return } var letters []rune for c : range common { letters append(letters, c) } sort.Slice(letters, func(i, j int) bool { return letters[i] letters[j] }) var res []rune for _, c : range letters { minCount : 131 - 1 for _, s : range docs { cnt : 0 for _, ch : range s { if ch c { cnt } } if cnt minCount { minCount cnt } } for i : 0; i minCount; i { res append(res, c) } } sort.Slice(res, func(i, j int) bool { return res[i] res[j] }) return string(res) }算法验证示例1[paper, parent, parade]→ 公共字母a,e,p,r→ 最小频次均为1 → 排序后aepr示例2[hello, hollow, halloween]→h:1, l:2, o:1→hlllo→ 排序后hllo示例3[abc,def,ghi]→ 无公共字母 → 返回空字符串所有实现均严格遵循题目要求的处理逻辑和输出格式。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2549918.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!