今天无意点进一个回文串的题目,对于回文串我第一印象就用双指针,但是确实没写出来,看了评论区题解,绝大多数都是用dp来做的,但是找到一个用双指针做的,刚好延续思路,先把题目贴出来。
给你一个字符串 s
,找到 s
中最长的回文子串。
如果字符串的反序与原始字符串相同,则该字符串称为回文字符串。
示例 1:
输入:s = "babad" 输出:"bab" 解释:"aba" 同样是符合题意的答案。
示例 2:
输入:s = "cbbd" 输出:"bb"
提示:
1 <= s.length <= 1000
s
仅由数字和英文字母组成这道题目之前一直做不对的原因是,我一直想的是回文串的中心点只能从给的字符串中心点取,这就思想有问题了。okok,看看这道题目双指针的解法,先说复杂度,时间复杂度o(n^2),空间复杂度o(1)。核心思想其实是,回文串就两种可能,一种是中间一个数值,一种是中间两个数值,因此就一个一个试,然后找到最长的,但是需要记录下来最长的start和end,这个公式反正有点迷糊,但是一写还真是这样。
class Solution {
public:
string longestPalindrome(string s) {
int len = s.size();
if(len == 0 || len == 1)
return s;
int start = 0;
int end = 0;
int mlen = 0;
for(int i = 0;i < len;++i){
int len1 = expendaroundcenter(s, i, i);
int len2 = expendaroundcenter(s, i, i+1);
mlen = max(max(len1, len2), mlen);
if(mlen > end - start + 1){
start = i - (mlen-1) / 2;
end = i + mlen / 2;
}
}
return s.substr(start, mlen);
}
private:
int expendaroundcenter(string s, int left, int right){
int L = left;
int R = right;
while(L >= 0 && R < s.length() && s[R] == s[L]){
L--;
R++;
}
return R - L - 1;
}
};
今天的每日一题目,题没看懂,等状态好了再看看。
前几天看的背包问题,今天看到一道纯种的背包,太纯了
给你一个整数 n
,返回 和为 n
的完全平方数的最少数量 。
完全平方数 是一个整数,其值等于另一个整数的平方;换句话说,其值等于一个整数自乘的积。例如,1
、4
、9
和 16
都是完全平方数,而 3
和 11
不是。
示例 1:
输入:n =12
输出:3 解释:12 = 4 + 4 + 4
示例 2:
输入:n =13
输出:2 解释:13 = 4 + 9
提示:
1 <= n <= 104
class Solution {
public:
int numSquares(int n) {
vector dp(n + 1, INT_MAX);
dp[0] = 0;
for (int i = 0; i <= n; i++) {
for (int j = 1; j * j <= i; j++) {
dp[i] = min(dp[i - j * j] + 1, dp[i]);
}
}
return dp[n];
}
};
给定一个包含红色、白色和蓝色、共 n
个元素的数组 nums
,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。
我们使用整数 0
、 1
和 2
分别表示红色、白色和蓝色。
必须在不使用库内置的 sort 函数的情况下解决这个问题。
示例 1:
输入:nums = [2,0,2,1,1,0] 输出:[0,0,1,1,2,2]
示例 2:
输入:nums = [2,0,1] 输出:[0,1,2]
提示:
n == nums.length
1 <= n <= 300
nums[i]
为 0
、1
或 2
进阶:
这道题目看到评论区有很巧妙的写法,但是呢,我选择直接冒泡,前几天总结了点冒泡排序和快排,这里就用上了,巧妙的做法就不贴了。
class Solution {
public:
void sortColors(vector& nums) {
for(int i = 0;i < nums.size() - 1;++i){
for(int j = 0;j < nums.size() - i -1;++j){
if(nums[j] > nums[j + 1]){
int tmp = nums[j];
nums[j] = nums[j + 1];
nums[j + 1] = tmp;
}
}
}
}
};