題目描述:
輸入乙個字串,求出其中最長的回文。(回文:正著看和倒著看相同,如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]是否為回文串的方法:
1int 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]為「對稱位置」
或者還可以這樣判斷:
1int ok = 1;2
//判斷回文
3int
t1, t2;
4for (t1 = i, t2 = j; t1 < t2; t1++, t2--)
1 #include2 #include3 #include4using
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 #include3 #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,因為這樣構不成回文 判斷出能形成回文以後,將元素減半,在字串一半的長度內進行組...