//求一个字符串中最长对称字串,好像有点如google,那么输出goog/*O(n2)的算法如果我们换一种思路,我们从里向外来判断。也就是我们先判断子字符串A是不是对称的。如果A不是对称的,那么向该子字符串两端各延长一个字符得到的字符串肯定不是对称的。如果A对称,那么我们只需要判断A两端延长的一个字符是不是相等的,如果相等,则延长后的字符串是对称的。因此在知道A是否对称之后,只需要O(1)的时间就能知道aAa是不是对称的。*/#include#include #include #include using namespace std;bool IsSymmetrical(char* pBegin, char* pEnd);void GetLongestSymmetricalLength_2(char* pString);void GetLongestSymmetricalLength(char* pString);void main(){ char c[30]; gets_s(c); //string s; //while(cin>>s){ //const char* c = s.c_str(); //GetLongestSymmetricalLength(c); //} GetLongestSymmetricalLength_2(c); system("pause");}void GetLongestSymmetricalLength(char* pString){ if(pString == NULL) return; int symmeticalLength = 1; char* pChar = pString; while(*pChar != '\0') { // Substrings with odd length char* pFirst = pChar - 1; char* pLast = pChar + 1; while(pFirst >= pString && *pLast != '\0' && *pFirst == *pLast) { pFirst--; pLast++; } int newLength = pLast - pFirst - 1; if(newLength > symmeticalLength) symmeticalLength = newLength; // Substrings with even length pFirst = pChar; pLast = pChar + 1; while(pFirst >= pString && *pLast != '\0' && *pFirst == *pLast) { pFirst--; pLast++; } newLength = pLast - pFirst - 1; if(newLength > symmeticalLength) symmeticalLength = newLength; pChar++; } cout< < pEnd) return false; while(pBegin < pEnd) { if(*pBegin != *pEnd) return false; pBegin++; pEnd --; } return true;}void GetLongestSymmetricalLength_2(char* pString){ if(pString == NULL) return; int symmeticalLength = 1; char* pFirst = pString; int length = strlen(pString); while(pFirst < &pString[length - 1]) { char* pLast = pFirst + 1; while(pLast <= &pString[length - 1]) { if(IsSymmetrical(pFirst, pLast)) { int newLength = pLast - pFirst + 1; if(newLength > symmeticalLength) symmeticalLength = newLength; } pLast++; } pFirst++; } cout< <