問題描述:
存在一個可讀寫的字符串,其中包括若干單詞,單詞間以空格區分,要求以單詞爲單位對字符串進行反轉。
算法思想:
(1)利用異或運算可以進行不申請空間進行字符交換
(2)利用遞歸的思想
(3)使用strchr函數區分單詞
解決方案:
(1)利用遞歸和異或運算進行字符交換,這一步將完成字符串的整體反轉
// 遞歸進行字符交換
void recursive_swap_char(char* lhs, char* rhs)
{
if(rhs <= lhs)
return;
*lhs ^= *rhs;
*rhs ^= *lhs;
*lhs ^= *rhs;
recursive_swap_char(lhs + 1, rhs - 1);
}
(2)逐個對字符串內的單詞進行反轉,則完成以單詞爲單位的反轉
// 遞歸進行單詞中字符反轉
void recursive_word_reverse(char* cur, char* next)
{
// 如果是最後一個單詞,按字符串進行反轉
if(next == NULL)
{
recursive_swap_char(cur, cur + strlen(cur) - 1);
return;
}
// 當前單詞內進行字符反轉
recursive_swap_char(cur, next - 1);
// 反轉下一個單詞
recursive_word_reverse(next + 1, strchr(next + 1, ' '));
}
完整代碼:
#include <iostream>
#include <tchar.h>
using namespace std;
// 遞歸進行字符交換
void recursive_swap_char(char* lhs, char* rhs)
{
if(rhs <= lhs)
return;
*lhs ^= *rhs;
*rhs ^= *lhs;
*lhs ^= *rhs;
recursive_swap_char(lhs + 1, rhs - 1);
}
// 遞歸進行單詞中字符反轉
void recursive_word_reverse(char* cur, char* next)
{
// 如果是最後一個單詞,按字符串進行反轉
if(next == NULL)
{
recursive_swap_char(cur, cur + strlen(cur) - 1);
return;
}
// 當前單詞內進行字符反轉
recursive_swap_char(cur, next - 1);
// 反轉下一個單詞
recursive_word_reverse(next + 1, strchr(next + 1, ' '));
}
char* reverse_by_word(char* src)
{
// 如果只有一個單詞,則直接返回
if(strchr(src, ' ') == NULL)
return src;
// 整體字符串反轉
recursive_swap_char(src, src + strlen(src) - 1);
// 反轉單詞
recursive_word_reverse(src, strchr(src, ' '));
return src;
}
void print(char* src)
{
cout << "src: " << src << endl;
cout << "dest: " << reverse_by_word(src) << endl;
}
int _tmain(int argc, _TCHAR* argv[])
{
char one[] = "one";
char one_two[] = "one two";
char one_two_three[] = "one two three";
char one_two_three_four[] = "one two three four";
char str_for_test[] = "There is a program for test";
print(one);
print(one_two);
print(one_two_three);
print(one_two_three_four);
print(str_for_test);
return 0;
}
運行結果:
附註:
(1)在網上搜到過別的同學的解法,反轉字符串時採用結尾字符('/0')逐次前進的操作,即不斷調用strlen,或者移位,或者加法運算,同時遞歸。而這裏採用快速排序的思想,進行前後兩個指針相互靠攏進行字符交換的遞歸調用,由於是在一個字符串進行操作,因而利用了指針的比較操作是有意義的。
(2)這裏使用的是單詞間只有一個空格,並且最後一個單詞後沒有空格。可能也會出現單詞間有多個空格的情況,解法就需要計算空格的個數,同樣可以通過strchr函數實現。