【问题标题】:How to delete duplicates in a string using recursion?如何使用递归删除字符串中的重复项?
【发布时间】:2018-05-01 22:22:57
【问题描述】:

我正在开发一个使用递归来删除字符串中重复字符的函数。问题是,我不确定如何继续传递一个字符串,以便在不以某种方式剪切字符串的情况下继续比较相邻字符。这是我目前所拥有的:

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"。关于我应该如何进行的任何提示?

【问题讨论】:

  • 重复项总是相邻吗?
  • 是的。其他预期结果示例如下:
  • stringClean("abbbcdd") → "abcd" stringClean("Hello") → "Helo"
  • if (str[0]==str[1]) return str[0]+stringClean(str.substr(2)); else return str[0]+stringClean(str.substr(1)); 终止条件留给读者练习。
  • 这个问题不适合递归解决方案。这是作业问题吗?无论如何,您需要比要求“任何提示”更具体。正如所问的,这个问题实际上需要一个关于如何编写递归函数的教程。阅读stackoverflow.com/help/asking。特别注意#5 - MCVE。然后发布一个显示更多努力的 MCVE。

标签: c++ string recursion


【解决方案1】:

算法:

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

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

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

    • 重复一个长度为 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;
}

【讨论】:

    【解决方案2】:

    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); 
    }
    

    【讨论】:

    • 如果你有abcdabcddcbadcba怎么办?
    猜你喜欢
    • 2020-08-12
    • 1970-01-01
    • 2022-01-26
    • 2011-10-20
    • 1970-01-01
    • 2019-08-30
    • 1970-01-01
    • 2023-04-02
    • 2020-07-17
    相关资源
    最近更新 更多