我正在编写一个程序,我必须从1开始逐步删除所有连续重复出现的子字符串。
例如,如果string是“abcabeccced”。 删除长度为1的重复子串后:“abcababceccced” - > “abcababceced”(2'c'被删除) 在移除长度为2的重复子串之后:“abcababceced” - > “abcabceced”(子串“ab”被删除) 等等...
有人可以为此提出有效的代码,甚至可以知道如何做到这一点吗?
答案 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++;
}
}
}
它可以更好地进行优化,但是,我选择优化伪代码来实现这个想法。这段代码的问题是:
答案 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的所有子串加倍,并用单个替换双倍的字符串。