回文子串[輸出所有回文子串]


回文子串
    總時間限制:1000ms  內存限制:65536kB
描述
    給定一個字符串,輸出所有長度至少為2的回文子串。
    回文子串即從左往右輸出和從右往左輸出結果是一樣的字符串,
    比如:abba,cccdeedccc都是回文字符串。
輸入
    一個字符串,由字母或數字組成。長度500以內。
輸出
    輸出所有的回文子串,每個子串一行。
    子串長度小的優先輸出,若長度相等,則出現位置靠左的優先輸出。
樣例輸入
    123321125775165561
樣例輸出
    33
    11
    77
    55
    2332
    2112
    5775
    6556
    123321
    165561

分析:

該題目輸出格式要求比較特別:子串長度小的優先輸出,若長度相等,則出現位置靠左的優先輸出。

所以,這里分如下幾個步驟來完成任務:

1、枚舉子串的所有可能的長度 for(len=2;len<=n;len++)

2、當長度確定為len時,枚舉所有長度為len的子串的開始點。

        maxBegin=n-len;
        for(begin=0;begin<=maxBegin;begin++)

3、當開始點和長度明確時,可以遍歷該子串並判斷其是否回文串。

            j=begin+len-1;
            for(i=begin;i<j;i++,j--)

詳細代碼如下:

 1 #include<stdio.h>
 2 #include<string.h>
 3 int main(int argc, char *argv[])
 4 {
 5     char a[505];
 6     int n,len,begin,maxBegin,i,j;
 7     freopen("29.in","r",stdin);
 8     scanf("%s",a);
 9     n=strlen(a);
10     for(len=2;len<=n;len++)//枚舉子串的所有可能的長度
11     {
12         maxBegin=n-len;
13         for(begin=0;begin<=maxBegin;begin++)//枚舉子串的開始點 
14         {
15             j=begin+len-1;
16             for(i=begin;i<j;i++,j--) //遍歷當前子串(a[i]~a[begin+len-1]),判斷是否回文串 
17             {
18                 if(a[i]!=a[j]) break;
19             }
20             if(i>=j)//是回文串
21             {
22                 j=begin+len-1;
23                 for(i=begin;i<=j;i++) printf("%c",a[i]);
24                 printf("\n");
25             }
26         }
27     } 
28     return 0;
29 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM