标签:
求解回文字符串:这道题是查找资料才得到的解法。具体思路如下:比如对字符串abcba,做如下处理#a#b#c#b#a#,目的是消除偶数的回文。计算一点的回文长度时,根据保存的前端的最大回文长度和中心点,判断当前点应该是从0开始计算,还是可以根据利用以前的结果。主要就是这个思路。
class Solution { public: string result; int maxpoint; int maxlen; vector<int> buf; string longestPalindrome(string s) { if(s.empty()) return s; string temp; temp = Init(s); buf.resize(temp.size()); maxpoint = 0; maxlen =0; int len =0; for(int i=0; i<temp.size(); i++) { len = Getlen(temp,i); buf[i] = len; if(len >= maxlen) { maxlen = len; maxpoint = i; } } for(int i = maxpoint - (maxlen - 1); i<= maxpoint + maxlen -1; i++) { if(temp[i] == ‘#‘) continue; result.push_back(temp[i]); } return result; } int Getlen(string& pattern,int mid) { int left=0, right =0; int index =1; if(maxpoint + maxlen > mid) { if(buf[2*maxpoint - mid] + mid - maxpoint > maxlen) { index = maxlen - (mid - maxpoint); } else { index = buf[2*maxpoint - mid]; } } while(1) { if(mid - index<0) break; if(mid + index>= pattern.size()) break; if(pattern[mid-index] != pattern[mid + index]) break; index++; } return index; } string Init(string& s) { string temp; bool flag = false; temp.push_back(‘#‘); for(int i=0; i<s.size(); ) { if(flag == false) { temp.push_back(s[i]); flag = true; i++; } else { temp.push_back(‘#‘); flag = false; } } if(flag == true) { temp.push_back(‘#‘); } return temp; } };
标签:
原文地址:http://www.cnblogs.com/xgcode/p/4265419.html