算法入門 3-4迴文

大致過程爲:先預處理,將非字母字符去掉,並將所有大寫字母轉爲小寫字母;然後從第二個字符開始作爲中間元素查找最長的迴文,並記錄最長的長度和位置;

難點是:輸出爲原輸入字符串的子串,這裏用的方法和作者的一樣,用數組p[]記錄預處理後的每個字符在原字符串的位置。

代碼如下:


//2014年6月24日23:16:08

#include <iostream>
#include <string>
#include <stdio.h>
using namespace std;

int p[5000+10];

int main()
{
    freopen("huiwen.in","r",stdin);
//    freopen("huiwen.out","w",stdout);
    string inputStr;
    string midStr;
    string resultStr = "";
    int resultLength = 1;
    int st = 0,en = 0;

    getline(cin,inputStr);
    int i = 0;
    for(string::size_type it=1 ; it<=inputStr.size() ; it++){
        if(inputStr[it]>='a' && inputStr[it]<='z'){
            midStr.push_back(inputStr[it]);
            p[i++] = it;
        }
        else if(inputStr[it]>='A' && inputStr[it]<='Z'){
            midStr.push_back(tolower(inputStr[it]));
            p[i++] = it;
        }
    }


    for(string::size_type it=1 ; it<=midStr.size() ; it++){
//            cout << inputStr[it] ;
        string::size_type i = 1;
        string::size_type mid = it;
        if(midStr[mid]==midStr[mid-1]){
            while(mid-1-i>=0 && mid+i<midStr.size() && midStr[mid-1-i]==midStr[mid+i]){
                i++;
            }
            i--;
            if(2*i > resultLength){
                resultLength = 2 * i;
                st = mid - 1 - i;
                en = mid + i;
//                resultStr = midStr.substr(mid-1-i,2*i);
//                cout << endl << resultStr << endl;
            }
        }
        //aba
        i = 1;
        if(midStr[mid-1]==midStr[mid+1]){
            while(mid-i>=0 && mid+i<midStr.size() && midStr[mid+i]==midStr[mid-i]){
                i++;
            }
            i--;
            if(2*i+1 > resultLength){
                resultLength = 2*i+1;
                st = mid - i;
                en = mid + i;
//                cout << endl << resultStr << endl;
            }
        }

    }
//    cout << st << " " << en << endl;
    for(string::size_type it=p[st] ; it<=p[en] ; it++){
        cout << inputStr[it];
    }
    cout << endl;
    return 0;
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章