📌  相关文章
📜  递归删除所有相邻重复项的 C++ 程序(1)

📅  最后修改于: 2023-12-03 15:28:22.651000             🧑  作者: Mango

递归删除所有相邻重复项的 C++ 程序

介绍

在编程过程中,有时候会出现相邻重复的元素,需要将其删除。这个问题可以通过递归算法来解决。

本文将通过C++语言来实现递归删除所有相邻重复的元素。

程序实现步骤
  1. 首先,我们需要定义一个函数,名为 removeDuplicates,它的参数类型是 string & 类型的引用。
void removeDuplicates(string &s) {
    ...
}
  1. 定义一个变量 i,表示当前处理到字符串的第 i 个字符位置,集合元素从 0 开始计数,即 i = 0。
void removeDuplicates(string &s) {
    int i = 0;
    ...
}
  1. 判断字符串长度是否小于 2,若小于2,则字符串中不存在相邻重复元素,直接返回字符串 s。
void removeDuplicates(string &s) {
    int i = 0;
    if(s.size() < 2) {
        return;
    }
    ...
}
  1. 定义变量 prev 表示 i 上一个字符的位置,即 i-1,将其赋值为 -1。定义变量 curr 表示当前字符 i 的位置。从位置 1 开始循环遍历字符串,如果 s[curr] == s[prev],则 curr++,否则,在 s[prev+1] 到 s[curr-1] 范围内递归调用 removeDuplicates 函数,然后 prev 赋值为 curr。
void removeDuplicates(string &s) {
    int i = 0, prev = -1, curr = 0;
    if(s.size() < 2) {
        return;
    }
    while(curr < s.size()) {
        if(curr > 0 && s[curr] == s[prev]) {
            curr++;
        } else {
            if(curr - prev > 1) {
                removeDuplicates(s.substr(prev + 1, curr - prev - 1));
            }
            prev = curr;
            curr++;
        }
    }
    ...
}
  1. 最后,在调用 removeDuplicates 函数的过程中,如果当前字符串已被修改,那么需将修改后的字符串重新赋值给形参 s。
void removeDuplicates(string &s) {
    int i = 0, prev = -1, curr = 0;
    if(s.size() < 2) {
        return;
    }
    while(curr < s.size()) {
        if(curr > 0 && s[curr] == s[prev]) {
            curr++;
        } else {
            if(curr - prev > 1) {
                string str = s.substr(prev + 1, curr - prev - 1);
                removeDuplicates(str);
                s.replace(prev + 1, curr - prev - 1, str);
                curr = prev + 1;
            } else {
                prev = curr;
                curr++;
            }
        }
    }
}
完整代码
#include <iostream>
#include <string>
using namespace std;

void removeDuplicates(string &s) {
    int i = 0, prev = -1, curr = 0;
    if(s.size() < 2) {
        return;
    }
    while(curr < s.size()) {
        if(curr > 0 && s[curr] == s[prev]) {
            curr++;
        } else {
            if(curr - prev > 1) {
                string str = s.substr(prev + 1, curr - prev - 1);
                removeDuplicates(str);
                s.replace(prev + 1, curr - prev - 1, str);
                curr = prev + 1;
            } else {
                prev = curr;
                curr++;
            }
        }
    }
}

int main() {
    string s;
    cout << "请输入字符串: ";
    getline(cin, s);
    removeDuplicates(s);
    cout << "删除相邻重复字符后: " << s << endl;
    return 0;
}

以上是递归删除所有相邻重复项的 C++ 程序。