一个Cruncher计划

时间:2012-01-21 13:04:27

标签: c algorithm

我正在编写一个程序,我必须从1开始逐步删除所有连续重复出现的子字符串。

例如,如果string是“abcabeccced”。 删除长度为1的重复子串后:“abcababceccced” - > “abcababceced”(2'c'被删除) 在移除长度为2的重复子串之后:“abcababceced” - > “abcabceced”(子串“ab”被删除) 等等...

有人可以为此提出有效的代码,甚至可以知道如何做到这一点吗?

2 个答案:

答案 0 :(得分:1)

这是未经测试的伪代码,但您希望执行以下操作:

 void crunch(char *str)
 {
   for (n=1; n<10; n++)
   {
     ptr = str;
     while (*ptr != '\0')
     {
       while (strncmp(ptr, ptr + n, n) == 0)
         strcpy(ptr, ptr + n);
       ptr++;
     }
   }
 }

它可以更好地进行优化,但是,我选择优化伪代码来实现这个想法。这段代码的问题是:

  • 效率低,因为它使用strcpy(src,dst指针对会更好)
  • ptr循环到达字符串的末尾,我们可以先中止
  • 那里有一个10的硬编码限制,这可以推广
  • 此函数会覆盖str指向的内存,而副本可能更好
  • (EDIT)将内部if更改为内部,同时将'crunch'重复序列。

答案 1 :(得分:1)

您可以直接从定义中编程:

input s : string
for len between 0 and s.Length / 2
    for pos between 0 and s.Length - len
        sub = s.substring(from pos to pos + len)
        subSub = sub + sub
        while (s.Contains(subSub))
            s = s.ReplaceAll(subSub, sub)

该算法尝试将长度为len的所有子串加倍,并用单个替换双倍的字符串。