[说明] 给定一个char类型的字符串,找到一个最短的摘要,定义为:一个包含原始字符串中所有字符的最短子字符串。
[实施例]
A =“aaabedacd”
B =“bedac”就是答案。
[我的解决方案]
定义一个包含256个元素的整数表,用于记录当前子字符串中每种字符的出现时间。
扫描整个字符串,使用上表统计给定字符串中的字符总数。
使用两个指针,start,end,它们最初指向给定字符串的开始和(start + 1)。目前的角色类型是1.
在末尾展开子字符串[start,end],直到它包含各种字符。如果可能,请更新最短的摘要。
每次在一个字符处开始收缩子字符串[start,end],如有必要,请尝试在第4步恢复其摘要属性。
时间成本为O(n),额外的空间成本是恒定的。
没有额外空间的任何更好的解决方案?
答案 0 :(得分:2)
当你考虑到字符实际上不限于256的情况时,效果非常差; Unicode中有更接近2 ^ 32个代码点;如果你尝试用UTF-8字符串计划的东西,它会爆炸。在很大程度上。
更好的方法是使用像MD5或FNV这样的摘要算法,或者做你正在做的事情,而是使用链表稀疏数组;在遇到角色时添加角色的代码点,然后连接代码点,然后转换为UTF-8。
编辑:
反例:“Påjapanskheter regn'雨'。”
答案 1 :(得分:2)
我不认为你的算法是正确的。考虑一下字符串:“baaabedacdc”。正确的答案仍然是“bedac”,但是你的算法将向前推进开始指针,直到找到“e”(发生次数为1的唯一字符),然后结束指针向后,直到找到“e” (唯一出现次数为1的字符),结果为“e”。
但是,我可能误解了算法。答案 2 :(得分:-1)
为什么不对这个问题使用更简单的算法,可能不是最有效的时间,但它有效;):
步骤1.(假设我们正在处理26个字母的字符集),创建一个大小为26的布尔数组并扫描字符串并检查对应于该字符的布尔值。例如,当你遇到a时,设置elem [0] = true,当你遇到b等时,设置elem [1] = true。
步骤2.使用elem [x] = true的字符创建一个字符串。所以,这种情况的字符串是“abcde”,长度= 5。
步骤3.第二次遍历给定的字符串,同时提取长度为5的子字符串,按升序对它们进行排序,并将它们与步骤2中的字符串进行匹配。