題目來自BMY BBS演算法版,原題如下:
不僅能判斷規則的中心對稱,如123454321,還要能判斷如123456547890中的45654的不規則部分中心對稱
演算法思想
從第一個字元開始,逐個掃描,對每一個字元,尋找下一個相同字元,判斷這兩個字元之間的字串是否迴文。時間複雜度O(n^3),所以說是笨笨解,師弟說可以做到O(n^2)...
演算法實現
/*================================================================================
功能:判斷字串是否是迴文字串或者是否含有迴文字元子串
作者:sunnyrain
日期:2008-09-11
編譯環境:VC++6.0
==================================================================
#include<iostream>
using namespace std;
int find(char ch,char *str,size_t length) //尋找str開始的字串中第一個ch出現的位置,沒找到返回-1
{
for(int i=0;i<length;i++)
{
if(ch == str[i])
return i;
}
return -1;
}
int isSym(char *str,size_t length) //判斷一個字串是否全對稱,0對稱,-1不對稱
{
for(int i=0;i<length/2;i++)
{
if(str[i] != str[length-i-1])
return -1;
}
return 0;
}
int isSymmetry(char *str,size_t length)//返回0表示全部對稱,-1表示無對稱,其他值表示局部對稱起始位置
{
int begin=0,end;
char ch;
for(int i=0;i<length;i++)
{
ch = str[i];
begin = end = i;
while((begin = find(ch,str+end+1,length-end-1)) != -1)
{
end = begin+end+1;
if(isSym(str+i,end-i+1) == 0)
return i;
}
}
return -1;
}
int main()
{
char aa1[] = "123454321";
char aa2[] = "123456547890";
char aa3[] = "781234327891";
char aa4[] = "954612313217891";
cout<<isSymmetry(aa1,sizeof(aa1)/sizeof(char)-1)<<endl;
cout<<isSymmetry(aa2,sizeof(aa2)/sizeof(char)-1)<<endl;
cout<<isSymmetry(aa3,sizeof(aa3)/sizeof(char)-1)<<endl;
cout<<isSymmetry(aa4,sizeof(aa4)/sizeof(char)-1)<<endl;
return 0;
}