1. 程式人生 > >Openjudge NOI題庫1.7程式設計基礎之字串 34:迴文子串

Openjudge NOI題庫1.7程式設計基礎之字串 34:迴文子串

 總時間限制: 1000ms 記憶體限制: 65536kB
描述

給定一個字串,輸出所有長度至少為2的迴文子串。

迴文子串即從左往右輸出和從右往左輸出結果是一樣的字串,比如:abba,cccdeedccc都是迴文字串。

輸入
一個字串,由字母或數字組成。長度500以內。
輸出
輸出所有的迴文子串,每個子串一行。
子串長度小的優先輸出,若長度相等,則出現位置靠左的優先輸出。
樣例輸入
123321125775165561
樣例輸出
33
11
77
55
2332
2112
5775
6556
123321
165561
思路:從第一個字元開始比較,先從兩個開始,比如12321 先看12 23 32 21 沒有就找123 232 321 然後 1232 2321 我用k控制我找的字元數,i控制字串的迴圈,然後寫一個函式判斷是否為迴文數,以上分析可知,當跨過k個字元時,i只需比較到len-k。程式碼如下
#include<iostream>  
#include<cstdlib>  
#include<algorithm>  
#include<iomanip>  
#include<string.h>  
#include<cstdio>  
using namespace std;
string str;
int len;  
int check(int x,int y)//檢查從x到y是不是迴文字串 
{
	int  s=x,t=y;
	while(s<=t)
	{
		if(str[s]!=str[t])return 0;//如果不相等直接返回 
		s++,t--;//繼續比較 
	}
	for(int i=x;i<=y;i++)//輸出這幾個字元 
	 cout<<str[i];
	 cout<<"\n";
	 return 0;
}
int main()
{
	getline(cin,str);//接收字串 
	len =str.size();
	for(int k=1;k<len;k++)//控制比較的字元數目,從兩個開始比較 
	 for(int i=0;i<=len-k;i++)//從第一個字元開始 跨過k個字元數 
	 check(i,i+k);
 }