【发布时间】:2015-09-03 05:52:29
【问题描述】:
写一个函数
void inplace(char *str,
const char pattern,
const char* replacement,
size_t mlen)
输入:str:以\0 结尾的字符串。输入表明我们需要一个就地算法。
pattern:一封信。
replacement:一个字符串。
mlen:内存大小保存字符串str从内存开头开始,mlen应该大于strlen(str)
最终结果还是由str指向的。
注意,所有出现的模式都应该被替换。
例如,
helelo\0...........
这里的“helelo”是要在末尾替换为'\0' 的字符串。在'\0' 之后还有 L 个有效字节。我们想用“123”替换“e”。
一个简单的方法是这样工作的,我们通过str,当匹配到一个模式时,我们将所有剩余的位置与填充替换字符串的位置一起移动,然后通过替换替换模式。
如果原始字符串的长度为n,并且只包含e,我们需要(n-1) + (n-2) + ... + 1 移位。
是否有一种算法可以只扫描一次字符串且内存成本不变?
【问题讨论】:
-
"如果原始字符串的长度为 n 并且只包含 e,我们需要 2(n-1) + 2(n-2) + ... + 2 个班次"。不,这是不正确的。每个字母只移动一次。示例:“abcdef”。右移一个字母表示,将“f”向下复制一个字符,将“e”向下复制一个字符,等等。您正在从字符串的末尾开始工作。这并不意味着像您暗示的那样从字符串的前面连续扫描。
-
如果原字符串是eeeec,那么新字符串应该是123123123123c。如果我们知道新字符串的长度,我们可以直接将c移动到最后的位置,然后在前面一一加上123。在不知道长度的情况下,当第一个 e 匹配时,我们将所有其余的 eeec 向右移动 2 个字节,这需要 4 次移动。当我们遇到第二个 e 时,我们需要另外 3 个动作..
-
好吧,你是对的。但那是因为您的问题仍未明确指定(即使您已经开始了一个新问题)。好吧,至少我不清楚你想替换所有出现的情况(是的,我可能应该假设 - 但这就是为什么应该始终清楚明确地指定需求,而不是为假设留出空间)。
标签: c algorithm string-algorithm