字串 單詞翻轉

2021-07-06 03:55:30 字數 3340 閱讀 6800

輸入乙個英文句子,翻轉句子中單詞的順序,要求單詞內字元的順序不變。標點視為單詞的一部分,單詞間以空格分開。

顯然,先將整個字串翻轉,再翻轉以空格隔開的各個小區間即可。 這裡需要用空格將字串分成多個小區間,這種需求在split等函式中也有。 

上**

#include #include // 翻轉p到q之間的內容,包括p和q

void rev_by_char(char *p, char *q)

while (p < q)

}// 是否空格

int is_space(int ch)

return 0;

}// 按單詞翻轉

void rev_by_word(char *p, int (*f)(int))

int size = strlen(p);

if (size == 0)

char *end = p + size - 1;

char *pre = p;

char *cur = p;

while (cur <= end)

rev_by_char(pre, cur - 1);

++cur;

pre = cur;

} rev_by_char(pre, cur - 1);

}void test(char *p)

int main() ;

test(a);

} ;test(a);

} ;test(a);

} ;test(a);

} ;test(a);

} ;test(a);

}}

執行結果:

[root@localhost fall]# g++ test.cc -o ts && ./ts

pre : [i am a student.]

post: [student. a am i]

pre : [ i am a student.]

post: [student. a am i ]

pre : [i am a student. ]

post: [ student. a am i]

pre :

post:

pre : [a]

post: [a]

pre : [ ]

post: [ ]

rev_by_word函式稍加改造,就可以用於split:

#include #include #include #include // 是否空格

int is_space(int ch)

return 0;

}//

void split(const std::string &s, std::vector&vs, int (*f)(int))

std::string::const_iterator it = s.begin();

std::string::const_iterator pre = it;

std::string::const_iterator itend = s.end();

while (it < itend)

vs.push_back(std::string(pre, it));

++it;

pre = it;

} vs.push_back(std::string(pre, it));

}void test(const std::string &s)

}int main()

}

執行結果:

[root@localhost fall]# g++ test.cc -o ts && ./ts

pre : [i am a student.]

0 [i]

1 [am]

2 [a]

3 [student.]

pre : [ i am a student.]

0 1

2 [i]

3 [am]

4 [a]

5 [student.]

pre : [i am a student. ]

0 [i]

1 [am]

2 [a]

3 [student.]

4 pre :

pre : [a]

0 [a]

pre : [ ]

0 1

split還可以加上兩個引數,以決定:  1.多個連續空格是否合併,2.支援split出前幾個元素

#include #include #include #include /*

* split("a bc d ", " ", vs, true, -1);

*/void split(const std::string &s,

const std::string &seps,

std::vector&vs,

bool do_not_merge = false,

int n = -1)

static const std::string __s_empty;

std::string::const_iterator it = s.begin();

std::string::const_iterator pre = it;

std::string::const_iterator itend = s.end();

while (it < itend)

if (pre < it || do_not_merge)

} ++it;

pre = it;

} if (pre < it || do_not_merge)

}void test(const std::string &s)

}int main()

}

總結一下這個問題,實際上是一種對陣列做切分,再對每個區間做操作的框架:

以字串為例:已知p和size

itend <-  p+size

it <-  p

pre <-  p

while (it < itend)

// 元素符合某條件

do_something(pre, it);  // 取出前閉後開區間 [pre, it) 中的內容,完成某個任務。 注意,如果pre

++it;

pre = it; }

// 處理結尾. 結尾也視為分隔符。

do_something(pre, it);  

翻轉字串 翻轉單詞字串

將一句話裡面的單詞進行倒置,標點符號不倒換。比如一句話 i come from china.倒換後變成 china.from come i 解析 解決該問題可以分為兩步,第一步全盤置換為 anihc morf emoc i 第二部對每個單詞進行逐步翻轉,如果不是空格,則開始翻轉單詞。具體 如下 in...

字串 單詞翻轉

給定乙個句子,翻轉其中的單詞 單詞之間由不確定的空格分隔 如 i come from china china from come i 基本思路 讀入字串,按照空格,單詞依次讀取進乙個 單詞表中,而後反向拼接單詞表即可 注意點 空格可能包含多個,讀取終止條件是,讀取空格時遇到了字元,讀取單詞時遇到了空...

字串單詞翻轉

題目要求 將字串以詞為單位進行翻轉。如 a bc def gh ij kml 變成 kml ij gh def bc a 時間複雜度o n 空間複雜度o 1 思路 先將整個字串按字母進行翻轉,然後再逐個單詞翻轉。如下 include using namespace std void wordturn...