代码之家  ›  专栏  ›  技术社区  ›  meta

字符串的最短摘要

  •  3
  • meta  · 技术社区  · 14 年前

    给定一个字符类型的字符串,找到一个最短摘要,它定义为:包含原始字符串中所有字符的最短子字符串。

    [示例]

    B=“bedac”是答案。

    [我的解决方案]

    1. 扫描整个字符串,使用上表统计给定字符串中的字符总数。

    2. 使用两个指针start和end,它们最初指向给定字符串的start和(start+1)。当前的字符类型是1。

    3. 压缩子字符串[开始,结束]每次以一个字符开头,如果需要,请在步骤4前尝试还原其摘要属性。

    没有多余的空间有更好的解决方案吗?

    3 回复  |  直到 14 年前
        1
  •  2
  •   Williham Totland    14 年前

    如果你考虑到字符实际上不限于256,Unicode中有接近2^32个码位,而如果你在UTF-8字符串上尝试你所计划的,它就会爆炸,这一点就非常糟糕了。在很大程度上。

    一个更好的方法是使用像MD5或FNV这样的摘要算法,或者做你正在做的事情,而不是使用 链表

    编辑:

        2
  •  2
  •   YeahStu    14 年前

    我认为你的算法不正确。考虑一下字符串:“baaabedacdc”。正确答案仍然是“bedac”,但是您的算法将向前推进开始指针,直到找到“e”(唯一出现次数为1的字符),然后向后移动结束指针,直到找到“e”(唯一出现次数为1的字符),结果为“e”。

    不过,我可能误解了算法。

        3
  •  -1
  •   jarajapu    14 年前

    为什么不使用一个更简单的算法来解决这个问题,可能不是最省时的,但它是有效的;):

    第一步。(假设我们处理的是26个字母的字符集),创建一个大小为26的布尔数组,扫描字符串并检查与字符对应的布尔值。例如,遇到a时设置elem[0]=true,遇到b时设置elem[1]=true。

    第三步。第二次遍历给定的字符串,同时提取长度为5的子字符串,按升序对它们进行排序,并将它们与步骤2中的字符串匹配。