簡體   English   中英

如何反轉字符串中的單詞中的字符(C ++)

[英]How to reverse the characters in a word in a string (c++)

我必須使用遞歸函數將字符串“ 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;   
}

算法是這樣的:

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. 反轉字符串。
  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()的遞歸版本。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM