递归删除字符串中的重复字符
Recursively removing duplicate characters in a string
我正在尝试创建一个递归函数,从字符串中删除连续的重复字符。除了前几个字符外,它工作正常。例如,如果我的输入是 MMMMMuuuuuOOOOOKKKKLLLEE OOOOLLL
或类似的东西,输出是 MMuOKLE OL
。正如您所看到的,除了前两个 M,它工作正常。我怎样才能使第一部分也起作用?
这是我的代码:
#include <stdio.h>
char* remove_duplicates (char* str){
if(*(str+1)!='[=10=]'){
if(*str==*(str+1)){
*(str+1)=*(str+2);
remove_duplicates(str+1);
}
remove_duplicates(str+1);
}
return str;
}
int main()
{
char sample[] = "MMMMMuuuuuOOOOOKKKKLLLEE OOOOLLL";
printf("OLD: |%s|\n", sample);
printf("NEW: |%s|\n", remove_duplicates(sample));
return 0;
}
我觉得递归太复杂了。
让我们从 str
开头的 2 个光标开始
首先在字符串上循环。
虽然我们没有到达字符串的末尾 *p
期待 p++
while (*p++) {
if (*p == *current)
continue;
如果下一个字符与当前字符相同,则继续搜索下一个不同的字符。
current++;
*current = *p;
当发现不同的字符时,将其放在当前字符之后。
#include <stdio.h>
char* remove_duplicates (char* str){
char *p = str;
char *current = p;
while (*p++) {
if (*p == *current)
continue;
current++;
*current = *p;
}
return str;
}
int main()
{
char sample[] = "MMMMMuuuuuOOOOOKKKKLLLEE OOOOLLL";
printf("OLD: |%s|\n", sample);
printf("NEW: |%s|\n", remove_duplicates(sample));
printf("NEW: |%s|\n", remove_duplicates(""));
return 0;
}
OLD: |MMMMMuuuuuOOOOOKKKKLLLEE OOOOLLL|
NEW: |MuOKLE OL|
NEW: ||
详细信息 AAAB
当前的 c
p
v
AAAB0
^
c
p
v
AAAB0
^
c
p
v
AAAB0
^
c
p
v
ABAB0
^
c
p
v
ABAB0
^
c
p
v
ABAB0
^
c
p
v
AB0B0
^
c
我们得到AB
谢谢大家的帮助。正如你所说,我在纸上浏览了我的代码,意识到问题是它没有比较第一个和最后一个 M。
我添加了一个新的 if 语句 if(*str==*(str-1)) *(str)=*(str+1);
,它现在可以工作了。
现在函数是:
char* remove_duplicates (char* str){
if(*(str+1)!='[=10=]'){
if(*str==*(str+1)){
*(str+1)=*(str+2);
remove_duplicates(str+1);
}
remove_duplicates(str+1);
}
if(*str==*(str-1)) *(str)=*(str+1);
return str;
}
我是这样做的:
#include <stdio.h>
char* remove_duplicates(char* str)
{
if (*str)
{
char* dest = remove_duplicates(str + 1);
str = (*str == *dest) ? dest : ((*(dest - 1) = *str), (dest - 1));
}
return str;
}
int main()
{
char sample[] = "MMMMMuuuuuOOOOOKKKKLLLEE OOOOLLL";
char sample2[] = "AA";
printf("OLD: |%s|\n", sample);
printf("NEW: |%s|\n", remove_duplicates(sample));
printf("OLD: |%s|\n", sample2);
printf("NEW: |%s|\n", remove_duplicates(sample2));
return 0;
}
输出
OLD: |MMMMMuuuuuOOOOOKKKKLLLEE OOOOLLL|
NEW: |MuOKLE OL|
OLD: |AA|
NEW: |A|
给你。
#include <stdio.h>
char * remove_duplicates( char *s )
{
if ( *s )
{
if ( *s == *( s + 1 ) )
{
*( s + 1 ) = *( s + 2 );
remove_duplicates( s + 1 );
remove_duplicates( s );
}
else
{
remove_duplicates( s + 1 );
}
}
return s;
}
int main(void)
{
char s[] = "MMMMMuuuuuOOOOOKKKKLLLEE";
remove_duplicates( s );
puts( s );
return 0;
}
程序输出为
MuOKLE
我这里只是添加递归函数(语言:C++)而不是整个代码。
void removeConsecutiveDuplicates(char input[]) {
if(input[0] == '[=10=]' || input[1]=='[=10=]') return;
if(input[0]!=input[1]) return removeConsecutiveDuplicates(input+1);
else
{
for(int i=1;i<=strlen(input);i++)
{
input[i-1] = input[i];
}
return removeConsecutiveDuplicates(input);
}
return;
}
我正在尝试创建一个递归函数,从字符串中删除连续的重复字符。除了前几个字符外,它工作正常。例如,如果我的输入是 MMMMMuuuuuOOOOOKKKKLLLEE OOOOLLL
或类似的东西,输出是 MMuOKLE OL
。正如您所看到的,除了前两个 M,它工作正常。我怎样才能使第一部分也起作用?
这是我的代码:
#include <stdio.h>
char* remove_duplicates (char* str){
if(*(str+1)!='[=10=]'){
if(*str==*(str+1)){
*(str+1)=*(str+2);
remove_duplicates(str+1);
}
remove_duplicates(str+1);
}
return str;
}
int main()
{
char sample[] = "MMMMMuuuuuOOOOOKKKKLLLEE OOOOLLL";
printf("OLD: |%s|\n", sample);
printf("NEW: |%s|\n", remove_duplicates(sample));
return 0;
}
我觉得递归太复杂了。
让我们从 str
首先在字符串上循环。
虽然我们没有到达字符串的末尾 *p
期待 p++
while (*p++) {
if (*p == *current)
continue;
如果下一个字符与当前字符相同,则继续搜索下一个不同的字符。
current++;
*current = *p;
当发现不同的字符时,将其放在当前字符之后。
#include <stdio.h>
char* remove_duplicates (char* str){
char *p = str;
char *current = p;
while (*p++) {
if (*p == *current)
continue;
current++;
*current = *p;
}
return str;
}
int main()
{
char sample[] = "MMMMMuuuuuOOOOOKKKKLLLEE OOOOLLL";
printf("OLD: |%s|\n", sample);
printf("NEW: |%s|\n", remove_duplicates(sample));
printf("NEW: |%s|\n", remove_duplicates(""));
return 0;
}
OLD: |MMMMMuuuuuOOOOOKKKKLLLEE OOOOLLL|
NEW: |MuOKLE OL|
NEW: ||
详细信息 AAAB
当前的 c
p
v
AAAB0
^
c
p
v
AAAB0
^
c
p
v
AAAB0
^
c
p
v
ABAB0
^
c
p
v
ABAB0
^
c
p
v
ABAB0
^
c
p
v
AB0B0
^
c
我们得到AB
谢谢大家的帮助。正如你所说,我在纸上浏览了我的代码,意识到问题是它没有比较第一个和最后一个 M。
我添加了一个新的 if 语句 if(*str==*(str-1)) *(str)=*(str+1);
,它现在可以工作了。
现在函数是:
char* remove_duplicates (char* str){
if(*(str+1)!='[=10=]'){
if(*str==*(str+1)){
*(str+1)=*(str+2);
remove_duplicates(str+1);
}
remove_duplicates(str+1);
}
if(*str==*(str-1)) *(str)=*(str+1);
return str;
}
我是这样做的:
#include <stdio.h>
char* remove_duplicates(char* str)
{
if (*str)
{
char* dest = remove_duplicates(str + 1);
str = (*str == *dest) ? dest : ((*(dest - 1) = *str), (dest - 1));
}
return str;
}
int main()
{
char sample[] = "MMMMMuuuuuOOOOOKKKKLLLEE OOOOLLL";
char sample2[] = "AA";
printf("OLD: |%s|\n", sample);
printf("NEW: |%s|\n", remove_duplicates(sample));
printf("OLD: |%s|\n", sample2);
printf("NEW: |%s|\n", remove_duplicates(sample2));
return 0;
}
输出
OLD: |MMMMMuuuuuOOOOOKKKKLLLEE OOOOLLL|
NEW: |MuOKLE OL|
OLD: |AA|
NEW: |A|
给你。
#include <stdio.h>
char * remove_duplicates( char *s )
{
if ( *s )
{
if ( *s == *( s + 1 ) )
{
*( s + 1 ) = *( s + 2 );
remove_duplicates( s + 1 );
remove_duplicates( s );
}
else
{
remove_duplicates( s + 1 );
}
}
return s;
}
int main(void)
{
char s[] = "MMMMMuuuuuOOOOOKKKKLLLEE";
remove_duplicates( s );
puts( s );
return 0;
}
程序输出为
MuOKLE
我这里只是添加递归函数(语言:C++)而不是整个代码。
void removeConsecutiveDuplicates(char input[]) {
if(input[0] == '[=10=]' || input[1]=='[=10=]') return;
if(input[0]!=input[1]) return removeConsecutiveDuplicates(input+1);
else
{
for(int i=1;i<=strlen(input);i++)
{
input[i-1] = input[i];
}
return removeConsecutiveDuplicates(input);
}
return;
}