[英]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函數。
好吧,首先是算法:
反轉字符串非常簡單,即使您被要求使用遞歸也是如此:
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.