NY132 最長回文子串

2021-07-10 19:06:00 字數 1515 閱讀 3888

時間限制:

1000 ms  |  記憶體限制:

65535 kb

難度:4 描述

輸入乙個字串,求出其中最長的回文子串。子串的含義是:在原串連續出現的字串片段。回文的含義是:正著看和倒著看是相同的,如abba和abbebba。在判斷是要求忽略所有的標點和空格,且忽略大小寫,但輸出時按原樣輸出(首尾不要輸出多餘的字串)。輸入字串長度大於等於1小於等於5000,且單獨佔一行(如果有多組答案,輸出第一組)。

輸入輸入乙個測試資料n(1<=n<=10);

隨後有n行,每行有乙個字串。

輸出輸出所要求的回文子串。

樣例輸入

1

confuciuss say:madam,i'm adam.

樣例輸出

madam,i'm adam

解題思路:

(1)預處理:將字母放在乙個陣列裡,且用乙個陣列記錄每個字母在原字串中的下標,以便最後的輸出;

(2)以每個字元作為回文的中值,進行左右遍歷,尋找最大回文個數,且記錄下左右的下標最後進行輸出;

奇數情況:以i=1  left = i-1,right = i+1 開始遍歷左右;

偶數情況:以i=0  left = i,    right = i+1 開始遍歷左右;

當回文為1的情況只需初始化起始和終點下標即可。

**寫的有點爛。。。有待改進。。。

#include #include int main()

if(c >= 'a' && c <= 'z')

}dispose[cot] = '\0';

//printf("%s\n",dispose);

int sum = 0,rcd_l,rcd_r,start_ood = 0,end_ood = 0,max_ood = 0,left,right;//wa了好幾次,大部分初始化為0後過了。。。醉了

for(i=1;i=0 && right <= cot)

else

left--;

right++;

}if(max_ood < sum)

}int max_even = 0,start_even = 0,end_even = 0;

for(i=0;i= 0 && right <= cot)

else

left--;

right++;

}if(max_even < sum)//尋找最大

}int start=0,end=0;

if(max_ood >= max_even)//如果奇數和偶數相同是,按奇數輸出,例如:hhhzxc,奇數累計1,而偶數也累計1,但是此時回文為hhh,所以為奇數

if(max_ood < max_even)

for(i=record[start];i<=record[end];i++)

printf("%c",str[i]);

printf("\n");

}return 0;

}

nyoj 132 最長回文子串

時間限制 1000 ms 記憶體限制 65535 kb 難度 4 描述 輸入乙個字串,求出其中最長的回文子串。子串的含義是 在原串連續出現的字串片段。回文的含義是 正著看和倒著看是相同的,如abba和abbebba。在判斷是要求忽略所有的標點和空格,且忽略大小寫,但輸出時按原樣輸出 首尾不要輸出多餘...

最長回文子串 最長回文子串行

1.最長回文子串行 可以不連續 include include include include using namespace std 遞迴方法,求解最長回文子串行 intlps char str,int i,int j intmain include include include using n...

最長回文子串

描述 輸入乙個字串,求出其中最長的回文子串。子串的含義是 在原串連續出現的字串片段。回文的含義是 正著看和倒著看是相同的,如abba和abbebba。在判斷是要求忽略所有的標點和空格,且忽略大小寫,但輸出時按原樣輸出 首尾不要輸出多餘的字串 輸入字串長度大於等於1小於等於5000,且單獨佔一行 如果...