在c++中删除字符串中连续重复的字符
Removing consecutive repeated characters in a string in C++
这是一个字符串问题。首先删除所有长度为1的重复连续子字符串,然后删除长度为2的子字符串,依此类推…例如,如果我们有一个像这样的字符串-> abcababcecced删除长度为1的子字符串后,我们将得到abcababceced删除长度为2的子字符串后,我们将得到ababced删除长度为3的子字符串后,我们将得到abced这将是最终输出
我已经设计了一个算法,但它的复杂度是0 (n3),这是不可取的。我的算法如下
char str[20]="abcababceccced";
int len=strlen(a);
for(i=1;i<=len/2;i++){
for(j=0;j<len;){
bool flag=chk(a,j,i);//this function will check whether the substring starting at a[j] and a[j+i] of length i are same or not.
if(flag){
//remove the second same substring.
}
else
j=j+i;
}
}
如果有人能在c++中提出一个不那么复杂的算法来解决这个问题,我将非常感激。
您可能能够通过"滑动"字符串相对于自身,比较字符到字符,然后寻找匹配的地方来构建一些东西。如:
abcababceccced
-abcababceccced
-0000000001100-
abcababceced
--abcababceced
--0001100110--
不清楚这是否会更快,但"顺序",只是一种不同的方式来看待问题。
实际上,对于每个子字符串长度,线性时间是可能的,因为您只想要连续相同的子字符串。只需要为相同的字符保留计数器,并在找到子字符串时更新字符串。由于您想要删除所有可能长度的子字符串,因此总体复杂度是二次的。
下面的C代码应该可以工作:
char str[20]="abcababceccced";
int len = strlen(str);
int i, j, counter;
for(i = 1; i <= len / 2; ++i)
{
for(j = i, counter = 0; j < len; ++j)
{
if (str[j] == str[j - i])
counter++;
else
counter = 0;
if (counter == i)
{
counter = 0;
memmove(str + j - i, str + j, (len - j) * sizeof(char));
j -= i;
len -= i;
}
}
str[j] = 0;
printf("%sn", str);
}
这应该依次打印:
abcababceced
abcabced
abced
你可以一次完成:
#include <stdio.h>
#include <string.h>
int main()
{
char str[] = "abbbbcaaaababbbbcecccedeeed";
int len = strlen(str);
int read_pos, write_pos, prev_char;
prev_char = str[0] + 1;
for (read_pos = 0, write_pos = 0; read_pos < len; read_pos++)
{
if (str[read_pos] != prev_char)
{
str[write_pos] = str[read_pos];
write_pos++;
}
prev_char = str[read_pos];
}
str[write_pos] = ' ';
printf("str = %sn", str);
return 0;
}
由于总是写入小于或等于读位置的位置,因此在使用字符串之前永远不会破坏它。
我已经将prev_char
初始化为与第一个字符绝对不同的东西,但是检查字符串的长度是否为零是有意义的。
相关文章:
- 从 argv[1] 转换为字符 * 字符串后有什么问题?
- 将 NULL 与 C 的字符* 字符串一起使用
- 无法在声明时使用初始值设定项列表初始化常量字符*/字符串数组的向量
- 无法将常量字符字符串传递给模板类
- 如何组合一个宽字符字符串,中间插入一些空字符
- 如何将二维数组类型字符(字符串)作为函数参数传递?
- 从给定索引返回子字符字符串的函数
- 字符 [](c 字符串)的初始化标准
- 如何将字符字符串用作数学运算符
- 将 Unicode 字符/字符串写入文件
- C++,字符* 字符串修改
- 如何有效地用不同的整数元素替换字符字符串的元素
- C++:如果我们在字符串中添加一些整数,为什么它会从开头删除该数量的字符?(字符串 + 整数)
- strcpy正在复制sth字符i字符串.如何解决此错误
- 在C++中将双精度转换为字符*/字符串
- C 中的宽字符字符串
- 如何提取C 中的字符/字符串之间的字符串
- 无法将字符/字符串转换为int
- 带有指针的反转字符字符串
- 反转字符串中的 n 个字符(字符串中没有空格),而不使用 c++ 中的内置函数