用C语言编写已知字符串S采用顺序储存结构,设计一个算法,从串S中删除所有与串T相同的子串
时间: 2024-12-10 09:27:35 浏览: 11
在C语言中,如果你有一个已知字符串`S`采用了顺序存储结构(如字符数组),并且需要删除其中所有与另一个给定字符串`T`相同的子串,可以使用滑动窗口的方法。这里是一个简单的算法描述:
1. 初始化两个指针,`i`指向`S`的起始位置,`j`指向`T`的起始位置。
2. 当`j`未超过`T`的长度,同时`i`未超过`S`的剩余部分时:
- 比较`S[i]`到`S[i+j-1]`与`T[j-1]`到`T[0]`是否相等。如果相等,则说明找到了一个子串。
- 如果找到匹配,将`S[i]`后面的元素向右移动一位覆盖掉,然后`i++`继续检查下一个位置;`j++`,直到`T[j]`不等于`S[i]`。
- 否则,如果没有匹配,只增加`i`的值。
3. 循环结束后,`S`中就只会保留不包含`T`子串的部分。
```c
#include <stdio.h>
#include <string.h>
void removeSubstr(char* S, char* T) {
int len_T = strlen(T);
for (int i = 0; i <= strlen(S) - len_T; ) {
if (memcmp(&S[i], T, len_T) == 0) {
memmove(&S[i], &S[i+len_T], strlen(S) - i - len_T);
i -= len_T;
} else {
i++;
}
}
}
int main() {
char S[] = "abcbadefabc";
char T[] = "abc";
removeSubstr(S, T);
printf("After removing: %s\n", S);
return 0;
}
```
阅读全文