程序员面试题精选(37):判断字符串是否是回文字符串或者是否含有回文字符子串

来源:互联网 发布:网络枪机套什么定额 编辑:程序博客网 时间:2024/05/21 19:46

题目来自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;
}