百度笔试题--最长回文字串

 1 #include <iostream>
 2 using namespace std;
 3 
 4 void substring(char* str)
 5 {    
 6     int len = strlen(str);
 7     len = 2*len + 1;
 8     for(int i = len; i >= 1; i--)
 9     {
10         if(i%2 == 0)
11             str[i-1] = str[i/2-1];
12         else
13             str[i-1] = '#';
14     }
15     str[len] = '\0';
16     int* p = new int[len]; //p[i]用来保存第i个字符为中心的回文字串向右/向左扩张的距离
17     int mx = 0; //表示已经处理的回文字串向右扩张的最长距离
18     int id = 0; //表示上述回文子串的中间位置
19     memset(p,0,len);
20     for(int i = 0; i < len; i++)
21     {
22         if(mx - i > 0)
23         {
24             p[i] = p[2*id - i] < (mx - i)?p[2*id - i]:(mx-i);
25         }
26         else
27             p[i] = 1;
28         while(str[i + p[i]] == str[i - p[i]]) p[i]++;
29         if(p[i] > mx - i)
30         {
31             mx = i + p[i];
32             id = i;
33         }
34     }
35     mx = 0;
36     id = 0;
37     for(int i = 0; i < len; i++)
38     {
39         if(p[i] > mx)
40         {
41             mx = p[i];
42             id = i;
43         }
44     }
45     cout<<"最长回文字串:";
46     for(int i = id-mx+1; i < id+mx; i++)
47     {
48         if(str[i] != '#')
49             cout<<str[i];
50     }
51     cout<<endl;
52 }
53 int main()
54 {
55     while(1)
56     {
57         char* str = new char[100];
58         if(str == NULL)
59             return 0;
60         cout<<"输入字符串:";
61         cin>>str;
62         substring(str);
63         delete[] str;
64         str = NULL;
65     }
66     return 0;
67 }

 

posted @ 2013-10-05 10:51  GOD_YCA  阅读(538)  评论(0编辑  收藏  举报