我正在使用一个使用递归的函数来删除字符串中的重复字符。问题是,我不知道如何继续传递一个字符串,以便继续比较相邻的字符,而不会以某种方式切断字符串。这是我到目前为止所做的:
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”。关于我应该如何进行的任何提示?
答案 0 :(得分:2)
算法:
从最左边的字符开始,如果有的话,删除左角的重复项。
如果字符串的长度为零或一,则返回字符串。
检查起始子串中最左边的字符。如果存在,则
如果起始子串中不存在最左边的字符,则
实施:
#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);
}