classSolution { public: string convert(string s, int numRows){ if (numRows <= 1) { return s; } int len_s = int(s.size()); int unit =(2*numRows-2); int n = len_s/unit; int remain = len_s%unit; string res(len_s, 0); for (int i = 0; i < len_s; i++) { int p = 0; if (i%unit == 0) { p = i/unit+1; } else { int r = i%unit + 1,c = i/unit+1; if (r > numRows) { r = unit-r+2; p = 1; } elseif (r == numRows) { p = 1-c; } p += n + (n*2)*(r-2) + 2*(c-1) + min(r-1, remain)+1; if (remain > numRows) { p += max(r-(unit-remain+2),0); } } res[p-1] = s[i]; } return res; } };
classSolution { public: map<int ,int, greater<int>> m; int rb=0,re=0; string longestPalindrome(string s){ int n = int(s.size()); if (n <= 0) { return""; }
go(s, 0, n); for (int off = 1; off < n; off++) { go(s, off, n); go(s, 0, n-off); } while (!m.empty()) { int sub = m.begin()->first; int sum = m.begin()->second; int beg = (sum-sub)/2; int end = (sum+sub)/2; if(go(s, beg,end) && ((re-rb) > (end-beg))) break; } return s.substr(rb, re-rb); } boolgo(string& s,int beg, int end){ int pos = isPalindrome(s, beg, end); if (pos != beg) { end -= pos-beg; beg = pos; m[end-beg]=end+beg; returnfalse; }else { m.erase(end-beg); if ((end-beg) > (re-rb)) { rb = beg; re = end; } returntrue; }
} intisPalindrome(string& s, int beg, int end){ int res = -1; for(int i = 0; i < (end-beg)/2; i++) { if(s[beg+i] != s[end-1 - i] && i > res) res = i; } return beg+res+1; } };
classSolution { public: int l=0,h=0; string longestPalindrome(string s){ int n = int(s.size()); if (n <= 1) { return s; } for (int i = 0; i < n; i++) { i = findLongest(s, i, n); } return s.substr(l, h-l+1); } intfindLongest(const string& s,int i, int n){ int high = i; while (high < n-1 && s[high+1] == s[i]) { high++; }// 中部字符全部相同 int ans = high; while (i > 0 && high < n-1 && s[i-1]==s[high+1]) { i--; high++;//向两边展开 } if ((high - i) > h-l) { h = high; l = i; //更新最长串的位置 } return ans; } };
classSolution { public: intuniquePaths(int m, int n){ if (m > n) { m = m+n; n = m-n; m = m-n; } int res = n; if (m < 2) { return1; } if (m == 2) { return n; } vector<int> v(m-2, 0); for (int i = 1; i <= n-1; i++) { v[0] += i; for (int j = 1; j < m - 2; j++) { v[j] += v[j-1]; } } for (int i = 0; i < m -2; i++) { res += v[i]; } return res; } };