每日coding

今天无意点进一个回文串的题目,对于回文串我第一印象就用双指针,但是确实没写出来,看了评论区题解,绝大多数都是用dp来做的,但是找到一个用双指针做的,刚好延续思路,先把题目贴出来。

5、最长回文子串

给你一个字符串 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;
    }
};

今天的每日一题目,题没看懂,等状态好了再看看。

前几天看的背包问题,今天看到一道纯种的背包,太纯了

279、完全平方数

给你一个整数 n ,返回 和为 n 的完全平方数的最少数量

完全平方数 是一个整数,其值等于另一个整数的平方;换句话说,其值等于一个整数自乘的积。例如,14916 都是完全平方数,而 311 不是。

示例 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];
    }
};

 

75、颜色分类

给定一个包含红色、白色和蓝色、共 n 个元素的数组 nums ,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。

我们使用整数 0、 12 分别表示红色、白色和蓝色。

必须在不使用库内置的 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]012

进阶:

  • 你能想出一个仅使用常数空间的一趟扫描算法吗?

这道题目看到评论区有很巧妙的写法,但是呢,我选择直接冒泡,前几天总结了点冒泡排序和快排,这里就用上了,巧妙的做法就不贴了。

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;
                }
            }
        }
    }
};

你可能感兴趣的:(数据结构)