C++練筆例子7

來源:互聯網
上載者:User

#include <iostream>
using namespace std;
//反序字串chs到字串rchs.
//參數:chs[]原字串, rchs[]目的字串, len 長度
inline void reverse(const char chs[], char rchs[], int len){
    int rindex = len;
    for(int i=0; i < len; ++i){
        rchs[--rindex] = chs[i];
    }
    rchs[len] = '/0';
}

//擷取臨時字串, 放置於temp 中. 
//參數: temp 臨時字串, chs 原字串, offset 位移量, 0-(len-1), len temp字串長度 
inline void getChs(char temp[], const char chs[], int offset, int len){
    int temp_index = -1;
    for(int i = 0; i < len; ++i){
        temp[++temp_index] = chs[offset + i];
    }
    temp[len] = '/0';
    cout << "the temp: " << temp << endl;
}

//驗證字串temp 是否存在於字串rchs 中.  存在返回ture, 否則返回false
//參數: temp 臨時字串, rchs 被檢驗是否包含temp的字串, len temp字串長度, limit 限制rchs被檢驗的字元數
inline bool compare(const char temp[], const char rchs[],int len, int limit){
    int ii = 0;          //rchs被檢驗的字元索引
    int offset = 0;      //temp中的位移量,  每次匹配重設
    bool first = false;  //是否匹配temp第一個字元標示.
//    if(strcmp(temp,"sabcd")==0){
//        cout << "len :: " << strlen(temp) << endl;
//    }
    while(ii < limit && offset < len){//當檢索到限制數目 或已經在rchs中匹配temp, 迴圈結束
        if(!first){
            if(temp[0] == rchs[ii]){
                first = true;  //匹配temp第一個字元
                offset = 1;    //位移量設定為第二個字元.
            }
        }else{
            if(temp[offset++] != rchs[ii]){ //檢驗單個字元是否匹配
                first = false;    //重新匹配temp 第一個字元標示
                offset = 0;       //重設位移量為0
            }
        }
        ++ii;
    }

    if(offset == len){ //匹配成功
        cout << "the result: " << temp << endl;
        return true;
    }
    else
        return false;
}

int main(){
 
    char chs[] = "fesabcdsfsfdcbasf";
    const int len = strlen(chs);
    cout << "len: " << len << endl;
    char rchs[len + 1];

    //反序
    reverse(chs, rchs, len);
   
    cout << chs << endl;
    cout << rchs << endl;
   
    int middle = len/2;
    bool flag = true;
    for(int i = middle; i > 0 && flag; --i ){
       
        for(int j=0; j <= (middle - i) && flag; ++j){
            char temp[len + 1];
            getChs(temp, chs, j , i);
            //flag = compare("sabc", "asabccccc", 4, 5);
            flag = !compare(temp, rchs, i, len - middle);
        }
    }
    system("pause");
    return 1;
}

這個例子是 在某個字串chs 中正序字串S及其反序字串SR並存的情況下, 求其中最大的正序字串.

 

思路: 1. 如字串chs= 'fesabcdsfsfdcbasf", 其反序字串rchs = "fsabcdfsfsdcbasef";

        2. 由於s 和 sr 是不覆蓋的, 所以取 chs 前部分去匹配rchs 的前部分就行了;

        3. chs 的長度是17, 所以最多取前8 個字串跟 rchs 匹配就行了, 只匹配 rchs 前(17-8) 個字串.

        4. the temp: fesabcds
            the temp: fesabcd
            the temp: esabcds
            the temp: fesabc
            the temp: esabcd
            the temp: sabcds

            以此類推, 逐漸減少匹配字串的長度, 直到成功匹配.

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.