最大回文字串

2022-08-30 18:03:10 字數 2053 閱讀 5254

題目描述:

輸入乙個字串,求出其中最長的回文。(回文:正著看和倒著看相同,如abba和yyxyy)。在判斷時,應該忽略所有標點符號和空格,且忽略大小寫,但輸出應保持原樣。輸入字串的長度不超過5000,且佔據單獨的一行。ying'g輸出最長的回文串,如果有多個,輸出起始位置最左邊的。

樣例輸入:confuciuss say: madam,i'm adam.

樣例輸出:madam,i'm adam

我們可以用fgets函式來得到輸入,格式為fgets(buf,max_size,stdin),它將讀取完整的一行放入陣列buf中。我們應當保證buf足夠存放一行的內容。

因為字串有很多標點,空格等,我們先將字串預處理:構造乙個新的字串,不包含原來的標點符號,而且將所有字元變成大寫。

1 n =strlen(buf);

2 m = 0;3

for(i = 0;i)

4if(isalpha(buf[i])) s[m++] = toupper(buf[i]);

1.列舉法

思路:列舉串的起點和終點,然後判斷它是否是回文串。

1

//偽**

2int max = 0;3

4for(i = 0;i)56

for(j =i;j)78

if(s[i...j]是回文串&&j-i+1>max) max = j-i+1;

判斷s[i...j]是否為回文串的方法:

1

int ok = 1;2

3for(k=i;k<=j;k++)45

if(s[k]!=s[i+j-k]) ok = 0; //

s[k]與s[i+j-k]為「對稱位置」

或者還可以這樣判斷:

1

int ok = 1;2

//判斷回文

3int

t1, t2;

4for (t1 = i, t2 = j; t1 < t2; t1++, t2--)

1 #include2 #include3 #include

4using

namespace

std;56

const

int max = 5010;7

char

buf[max], s[max];89

intmain()

1027

if (ok&&j - i + 1 >max) 31}

32}33for (int x = start; x < start+max; x++)

36 cout << "

最大回文字串的長度為

"<< max <37 system("

pause

");

38return0;

39 }

為了輸出子串在字串中原本的模樣,需要用乙個陣列記錄,p[i]儲存s[i]在buf中的位置。

最終版本為:

1 #include2 #include

3 #include4

using

namespace

std;56

char buf[100];7

char str[100];8

int pos[100];9

intmain()

1022}23

24for (int i = 0; i < m; i++) 33}

3435

for (int j = 0; i - j >= 0 && i + j + 1

< m; j++) //

處理字串為偶數時的情況

3643}44

}45for (int i = x; i <= y; i++)

46 cout <47 cout <4849 cout <50 cout << "

最大回文串的長度為

"<< max <51 system("

pause");

52 }

最大回文字串長度 manacher演算法

參考 題目 hdu3068 hdu3068.cpp 定義控制台應用程式的入口點。include stdafx.h include include include include using namespace std int longestpdr vector vc for int i 0 i rd...

回文字串

描述 所謂回文字串,就是乙個字串,從左到右讀和從右到左讀是完全一樣的,比如 aba 當然,我們給你的問題不會再簡單到判斷乙個字串是不是回文字串。現在 要求你,給你乙個字串,可在任意位置新增字元,最少再新增幾個字元,可以使這個字串成為回文字串。輸入第一行給出整數n 0思路分析 1.判斷字串前後倆個字元...

回文字串

還是在龐果網 看到的題目,這次選了個簡單的,回文字串。題目內容 回文字串是指從左到右和從右到左相同的字串,現給定乙個僅由小寫字母組成的字串,你可以把它的字母重新排列,以形成不同的回文字串。思路 不滿足上面條件的直接返回0,因為這樣構不成回文 判斷出能形成回文以後,將元素減半,在字串一半的長度內進行組...