52ky 发表于 2022-5-4 09:11:22

递归函数来反转字符串中的子字符串

问题
我正在做一个实验任务,用户输入一个字符串,并且字符串中子字符串的起点和终点要反转。例如,如果用户输入字符串“go bobcats”、数字 3(用于开始索引)和 7(用于结束索引),则输出应该是“go accobts”。我可以编写一个递归函数来反转整个字符串(“go bobcats”变成“stacbob og”),但我遇到了子字符串的问题。

完整的字符串反转代码:
void reversing(string s, int start, int end){
    if(s.size() == 0){return;}
    else{
      reversing(s.substr(1), start + 1, end);
      cout << s;
    }
}
对于它的开始和结束索引,我只输入了 0 和 9,因为这是字符串的全长。

如何调整函数,使其仅反转在用户输入的索引处开始和结束的字符串?此外,在当前函数中,我必须在 main 中使用 endl 在字符串输出的末尾创建一个新行。我可以在函数中执行此操作吗?如果我放一个 cout << s;在 endl 之后,它在每次迭代后放置一个新行,使输出垂直:

公司

t型



c类

第二

o型

第二

o型

公克

主要实现:
string s;
    int start, end;
    cout << "Enter a string: ";
    while(cin.peek() == '\n' || cin.peek() == '\r'){
      cin.ignore();
    }
    getline(cin,s);
    cout << "Now enter two numbers that are within the bounds of the string. ";
    cin >> start >> end;
    cout << "This is how your words look now:\n";
    reversing(s,start,end);
    cout << endl;
回答
反转字符串的函数交换范围两端的元素并在任一侧将范围缩小一个。
void reversing(string& s, int start, int end) {
    if (start >= end)
      return;
    swap(s, s);
    reversing(s, start + 1, end - 1);
}
然后进入 main() :
// ...
cout << "This is how your words look now:\n";
reversing(s, start, end);
cout << s << endl;




页: [1]
查看完整版本: 递归函数来反转字符串中的子字符串