#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
以此類推, 逐漸減少匹配字串的長度, 直到成功匹配.