如何使用递归删除字符串中的重复项?

时间:2017-11-18 04:36:36

标签: c++ string recursion

我正在使用一个使用递归的函数来删除字符串中的重复字符。问题是,我不知道如何继续传递一个字符串,以便继续比较相邻的字符,而不会以某种方式切断字符串。这是我到目前为止所做的:

string stringClean(const string& str)
{
   string s1 = str;

   if (/*first char == next char*/)
      s1.at(/*first char*/) = "";
      return stringClean(s1);
   else 
      return s1;
}

例如,stringClean(“yyzzza”)应返回“yza”。关于我应该如何进行的任何提示?

2 个答案:

答案 0 :(得分:2)

算法:

  • 从最左边的字符开始,如果有的话,删除左角的重复项。

  • 如果字符串的长度为零或一,则返回字符串。

  • 检查起始子串中最左边的字符。如果存在,则

    • 重复长度为 n-1 的字符串(没有最后一个字符的字符串)。
  • 如果起始子串中不存在最左边的字符,则

    • 对剩余的字符串进行递归并存储唯一字符。

实施:

#include <string>
#include <iostream>

using namespace std;

string removeDups(string s) {
    if(s.length() <= 1) return s;
    if(s.substr(0, s.length() - 1).find(s.substr(s.length() - 1, s.length())) != string::npos) {
        return removeDups(s.substr(0, s.length() - 1));
    } else {
        return removeDups(s.substr(0, s.length() - 1)) + s.substr(s.length() - 1, s.length());
    }
}


int main() {
    string s;
    cin >> s;
    cout << removeDups(s);
    
    return 0;
}

答案 1 :(得分:1)

<强> C ++

这就是我刚想到的事情

#include <iostream>
#include <string>

std::string rec(std::string &word, int index);
std::string rec(std::string word) {
    if(word.length() <= 1) {
         return word;
    }
    return word[0] + rec(word, 1);
}

std::string rec(std::string &word, int index) {
   if(index == word.length()) {
       return "";
   }
   return (word[index] != word[index-1] ? std::string(1, word[index]) : "") + rec(word, index+1); 
}

int main() {
    std::cout << rec("aaabbbbcccddd") << std::endl;
}

对于一行递归爱好者:

std::string rec(std::string &word, int index) {
   return index == word.length() ? "" : (word[index] != word[index-1] ? std::string(1, word[index]) : "") + rec(word, index+1); 
}