如何反转字符串中的单词中的字符(C ++)

时间:2018-11-05 03:57:41

标签: c++ string recursion

对于使用递归函数的分配,我必须将字符串“ Cat正在运行”反转为“ running is Cat”。我能够反转整个字符串,但单词本身是反向的,显示为“ gninnur si taC”。我该如何解决?我只是递归函数做错了吗,还是我错过了他们的另一步?谢谢! (仅使用递归函数)

#include <iostream>
#include <string>
using namespace std;

string Reverse(string str,string strCopy, int end, int start)
{   
    if (str[start] != '\0')
    {
        strCopy[end]=str[start];
        return Reverse(str, strCopy, end - 1, start + 1);
    }
    else { return strCopy; }    
}

int main()
{
    string str = "Cat is running";
    string strCopy = str;
    int start = 0;
    int end = str.length()-1;
    cout <<Reverse(str, strCopy, end, start) << endl;   
}

2 个答案:

答案 0 :(得分:0)

算法如下:

recursive_reverse_words(input):
  if (input has one word or empty) return input
  first_word, rest = split(input)
  return recursive_reverse_words(rest) + " " + first_word

您需要编写split函数。

答案 1 :(得分:0)

首先,算法:

  1. 反转字符串。
  2. 查找单词。
    1. 扭转它们。

即使您被迫使用递归,反转字符串也非常简单:

template <class BidiIter>
void reverse(BidiIter first, BidiIter last) {
    if (first == last || first == --last) return;
    std::iter_swap(first, last);
    reverse(++first, last);
}

仅反转 单词本身比较棘手:

template <class BidiIter>
void reverse_words_only(BidiIter first, BidiIter last) {
    if (first == last) return;
    const auto pred = [](unsigned char c){ return isspace(c); };
    const auto begin = std::find_if_not(first, last, pred);
    const auto end = std::find_if(begin, last, pred);
    reverse(begin, end);
    reverse_words_only(end, last);
}

接下来,使用它来逐字反转字符串:

template <class BidiIter>
void reverse_words(BidiIter first, BidiIter last) {
    reverse(first, last);
    reverse_words_only(first, last);
}

一切都很好,尾递归。不过,您可能必须编写std::find_if()std::find_if_not()的递归版本。