intcount=0;//新数组的下标 inti=0, j = 0; while (count != (m + n)) {//循环结束条件 if (i == m) {//第一个数组到头了 while (j != n) { nums[count++] = nums2[j++]; } break; } if (j == n) {//第二个数组到头了 while (i != m) { nums[count++] = nums1[i++]; } break; }
classSolution { public: string longestPalindrome(string s){ int n = s.size(); if (n < 2) {//特殊情况1:只有一个字符 return s; }
int maxLen = 1; int begin = 0; // dp[i][j] 表示 s[i..j] 是否是回文串 vector<vector<int>> dp(n, vector<int>(n));//这里把vector写成静态的,可以直接用普通数组 // 初始化:所有长度为 1 的子串都是回文串 for (int i = 0; i < n; i++) { dp[i][i] = true;//棋盘格上的对角线元素直接填 } // 递推开始 // 先枚举子串长度 //思考一种枚举方法,要把所有组合都考虑到,而且要从内核向外,能够填表 for (int L = 2; L <= n; L++) {//L是子串长度,先固定长度,移动边界,长度由2慢慢增上去,动态规划是由内核而外(由边界条件向外)(先因再果)才能填表,这是和递归不一样的地方,递归是由果溯因 for (int i = 0; i < n; i++) {//i是左边界 // 由 L 和 i 可以确定右边界,即 j - i + 1 = L 得 int j = L + i - 1; // 如果右边界越界,就可以退出当前循环 if (j >= n) { break; }
classSolution { public: pair<int, int> expandAroundCenter(const string& s, int left, int right){//left,right是扩张的起始位置 while (left >= 0 && right < s.size() && s[left] == s[right]) {//条件成立就一直扩张 --left; ++right; } return {left + 1, right - 1};//扩张到最大返回 }
string longestPalindrome(string s){ int start = 0, end = 0;//这两个用于记录最长串 for (int i = 0; i < s.size(); ++i) {//遍历一遍,i是回文中心 auto [left1, right1] = expandAroundCenter(s, i, i);//奇外扩 auto [left2, right2] = expandAroundCenter(s, i, i + 1);//偶外扩 if (right1 - left1 > end - start) { start = left1; end = right1; } if (right2 - left2 > end - start) { start = left2; end = right2; } } return s.substr(start, end - start + 1); } };
classSolution { public: string convert(string s, int numRows){ if (numRows < 2)//特殊情况 return s; vector<string> rows(numRows); int i = 0, flag = -1; for (char c : s) {//这是什么语法? rows[i].push_back(c); if (i == 0 || i == numRows -1) flag = - flag; i += flag;//用flag实现了i的周期性变化:123212321 } string res; for (const string &row : rows) res += row; return res; } };