文字列逆シーケンスのまとめ

3879 ワード

タイトル:文字列を受け入れ、反転した文字列を出力します.例えばs=「abcd」であり,逆シーケンス後にs=「dcba」となる.
この問題は比較的簡単で、方法もたくさんあります.ここで簡単にまとめて、参考にします.
プログラム1−プログラム4はいずれも比較的基本的な方法であり,プログラム5−プログラム8は比較的高度な方法である.
プログラム1
#include 
#include

using namespace std;  
  
int main()  
{  
    string str,s = "";
	cin>>str;
	for(int i = 0;i
プログラム2
#include 
#include 
#include 
using namespace std;
 
int main(){
    string ss;
    while(getline(cin,ss)){
        reverse(ss.begin(),ss.end());
        cout<
プログラム3:
#include
using namespace std;
int main() {
    string str;
    getline(cin,str);
    int len = str.size();
    int i = 0;
    int j = len-1;
    while(i < j) {
        char temp = str[i];
        str[i] = str[j];
        str[j] = temp;
        i++;
        j--;
    }
    cout<
プログラム4:
#include
#include
using namespace std;
int main()
{
    string s1;
    while(getline(cin,s1))
    {
        for(int i=s1.length()-1;i>=0;i--)
         {
            cout<
プログラム5:
char* Reverse(char* s)
{
    // q           
    char* q = s ;
    while( *q++ ) ;
    q -= 2 ; 

    //    ,         。
    char* p = newchar[sizeof(char) * (q - s + 2)] ; 
    char* r = p ;

    //     
    while(q >= s)
        *p++ = *q-- ;
    *p = '\0' ;

    return r ;
}
プログラム6:
原地逆序(in-place reverse)これは最もよく考えられ、原地逆序は余分な分配空間を許さないことを意味し、主に以下のいくつかの方法があり、思想があまり悪くなく、文字列の両側の文字を1つずつ交換することであり、以下の図である.与えられた文字列「abcdef」は、逆シーケンスのプロセスが、それぞれ、交換文字aおよびf、交換文字bおよびe、交換文字cおよびdである.2つのポインタを設定して、文字列の頭と尾を指し、2つのポインタが指す文字を交換し、交差するまでポインタを中間に移動します.
char* Reverse(char* s)
{
    // p       
    char* p = s ;

    // q       
    char* q = s ;
    while( *q )
        ++q ;
    q -- ;

    //        ,  p q  
    while(q > p)
    {
        char t = *p ;
        *p++ = *q ;
        *q-- = t ;
    }

    return s ;
}
プログラム7:再帰的な方法
//     s   left right      ,   
void Reverse( char* s, int left, int right )
{
    if(left >= right)
        return;

    char t = s[left] ;
    s[left] = s[right] ;
    s[right] = t ;

    Reverse(s, left + 1, right - 1) ;
}
プログラム8:異種または操作
//           s    
char* Reverse(char* s)
{
    char* r = s ;
    // p           
    char* p = s;
    while (*(p + 1) != '\0')
        ++p ;
    //           
    while (p > s)
    {
        *p = *p ^ *s ;
        *s = *p ^ *s ;
        *p = *p-- ^ *s++ ;
    }

    return r ;
}

拡張:単語の逆順序
文字列が与えられ、単語ごとに文字列が逆順序になり、例えば「This is a sentence」が与えられた場合、出力は「sentence a is This」であり、問題を簡略化するために文字列には句読点が含まれない.
2段階に分ける
1単語の逆順で「sihT si a ecnetnes」を得る
2文全体を逆順にして「sentence a is This」を得る
ステップ1では、単語をどのように決定するかが重要です.ここでは、スペースを単語の境界とします.単語を見つけたら、上記の方法でこの単語を逆順にすることができます.すべての単語が逆順になった後、全体の文を1つの全体(すなわち、大きなスペースを含む単語)と見なしてもう一度逆順すればよい.下図に示すように、1行目は元の文字に置き換えられ、2行目は単語の逆順後の文字列で、最後の行は文全体の逆順後の文字列である.
//    p q         
void ReverseWord(char* p, char* q)
{
    while(p < q)
    {
        char t = *p ;
        *p++ = *q ;
        *q-- = t ;
    }
}

//         
char* ReverseSentence(char* s)
{
    //                   
    char* p = s ; //         
    char* q = s ; //        '\0'

    while(*q != '\0')
    {
        if (*q == '')
        {
            ReverseWord(p, q - 1) ;
            q++ ; //           
            p = q ;
        }
        else
            q++ ;
    }

    ReverseWord(p, q - 1) ; //          
    ReverseWord(s, q - 1) ; //        

    return s ;
}

参考資料:
文字列面接問題(一)文字列逆順
C++交換の2つの数のまとめ