字符串题目

字符串

1、string数组的最长公共前缀

https://leetcode-cn.com/problems/longest-common-prefix/comments/

class Solution {
public:
    string longestCommonPrefix(vector<string>& strs) {
        string res = strs[0];

        for(int i=1; i<strs.size(); i++)
        {
            for(int j=0; j<res.size();j++)
            {
                if(res[j] != strs[i][j])
                {
                    res = res.substr(0,j);
                    break;
                }
            }
        }
        return res;
    }
};

2、求字符串中不含重复字符的最长字串

https://leetcode-cn.com/problems/zui-chang-bu-han-zhong-fu-zi-fu-de-zi-zi-fu-chuan-lcof/

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        if(s.length()<=1) return s.length();

        int res = -1, right = 0;
        unordered_set<char> store;

        for(int left=0; left<s.length();left++)
        {
            while(right < s.length() && !store.count(s[right]))
            {
                store.insert(s[right]);
                right++;
            }

            res = max(res,right - left);
            store.erase(s[left]);

            if(right>=s.length()) break;
        }
        return res;
    }
};

3、完美子串的个数

参考:https://blog.csdn.net/qq_44745063/article/details/114627854

vector<string> GetPerfectStr(string& s)
{
    int len = s.size();//记录字符串长度
    vector<string> res;//用来储存结果
    vector<vector<string>> dp(len + 1, vector<string>(len + 1));//实现动归的数组
    map<char,int> mp;//用map的去重来统计包含字符
    for (auto str : s)
    {
        mp[str]++;
    }
    string countstr = "";
    for (auto c : mp)
    {
        countstr+=c.first;
    }//到此,统计字符结束

    //初始化
    for (int i = 0; i < len + 1; i++)
    {
        for (int j = 0; j <= i; j++)
        {
            dp[i][j] = countstr;
        }
    }

    for (int i = 0; i < len + 1; i++)
    {
        for (int j = 1; j < len + 1; j++)
        {
            int pos = dp[i][j - 1].find(s[i]);
            if (pos != string::npos)
            {
                dp[i][j] = dp[i][j - 1].erase(pos, 1);
            }
            else
                dp[i][j] = dp[i][j - 1];
            if (dp[i][j] == "")
            {
                res.push_back(s.substr(i, j));
            }
        }
    }
    return res;
}

4、删除s1中所有S2中的字符

#include<iostream>
#include<set>
#include<string.h>

using namespace std;



void re_str_delete(string& a, string& b)
{
    set<char> temp;
    for (auto s : b)
    {
        temp.insert(s);
    }

    int i = 0;
    while (a[i]!= '\0')
    {

        while(temp.find(a[i]) != temp.end())
        {
            a.erase(a.begin()+i);
        }
        i++;
    }
}



int main()
{
    string a = "abcdefghdijabklcmn";
    string b = "abcdef";

    re_str_delete(a, b);

    for (int i = 0; i < a.size(); ++i)
    {
        cout << a[i];
    }
    cout << endl;

    system("pause");
    return 0;
}

5、最长回文子串

动态规划

class Solution {
public:
    int getLongestPalindrome(string A, int n) {
        // write code here
        if(n < 2 ) return n;

        vector<vector<bool>> dp(n,vector<bool>(n));

        int maxLen = 0;

        for(int i=0; i<n; i++)
        {
            dp[i][i] = 1;
        }

        for(int L=2; L<=n; L++)
        {
            for(int i=0; i<n; i++)
            {
                int j = L + i - 1;

                if(j >=n) break;

                if(A[i] != A[j]) dp[i][j] = false;
                else{
                    if(j - i < 3) dp[i][j] =true;
                    else{
                        dp[i][j] = dp[i+1][j-1];
                    }
                }
                if(dp[i][j] == true && j - i + 1 > maxLen)
                {
                    maxLen = j - i + 1;
                }
            }
        }
        return maxLen;
    }
};

6、最长递增子序列

动态规划+二分
上面的动态规划算法需要向前遍历找到前一个k,导致算法复杂度为O(nn),一个牛逼的想法是使用二分查找优化,使复杂度降低为O(nlogn)。
基本点在于维护一个数组maxEnd,其元素maxEnd[k]表示长度为k+1的递增长子序列的最后一个元素,并且是字典序最小的那个。显然maxEnd是一个递增数组。
1 如果arr[i] > maxEnd.back()时,显然直接..., maxEnd.back(), arr[i]依然是一个递增子序列。
2 问题是arr[i] <= maxEnd.back()时怎么处理?
我们找到maxEnd中大于等于arr[i]的元素位置k,将maxEnd[k]替换为arr[i],这表示将长度为k+1的子序列的最后一个元素更新为更小的值。显然更合理。然后再同步更新dp[k]值的为i。

class Solution {
public:
    /**
     * retrun the longest increasing subsequence
     * @param arr int整型vector the array
     * @return int整型vector
     */
    vector<int> LIS(vector<int>& nums) {
        // write code here
        if (nums.size() <= 1)
            return nums;
        vector<int> dp(nums.size(), 0);
        vector<int> pos(nums.size(), 0);//pos[i]=j用来记录nums[i]在dp中的第j个位置
        int len = 0;
        dp[len] = nums[0];
        for (int i = 1; i < nums.size(); ++i) {
            if (nums[i] > dp[len]) {
                dp[++len] = nums[i];
                pos[i] = len;
            }
            else {
                int low = 0, high = len;
                while (low <= high) {
                    int mid = (low + high) >> 1;
                    if (dp[mid] < nums[i])
                        low = mid + 1;
                    else 
                        high = mid - 1;
                }
                if (low != -1) { 
                    dp[low] = nums[i];  
                    pos[i] = low; 
                }
                else { 
                    dp[0] = nums[i]; 
                    pos[i] = 0; 
                }
            }
        }
        vector<int> res(len + 1, INT_MAX);
        for (int i = nums.size() - 1; i >= 0; i--) {
            if (pos[i] == len) {
                res[len] = min(res[len], nums[i]);
                len--;
            }
        }
        return res;
    }
};
全部评论

相关推荐

03-05 17:03
已编辑
浙江工商大学 C++
陈好好wy:整体看下来有点空空的感觉,可以把每一段项目经历都再完善一下,然后用小标题的形式写个两到三条,目前看有点太简单了,不太能看出具体在这个项目里做了什么工作。还是要尽量把自己做的工作以量化的形式体现在简历上呢。
双非本科求职如何逆袭
点赞 评论 收藏
分享
昨天 08:58
已编辑
门头沟学院 Java
ttl:&nbsp;3.19一面晚上过3.20二面3.23oc3.25offerbase:末9有一段中小厂实习一面面经:(总体时长一个小时二十分钟左右没什么八股,主要都是问项目和场景题1.实习(问了有四十分钟,感觉面试官很看重实习这一块,一直在拷打,问到后面我都要疯了,好在准备得比较充分1️⃣用的是什么中间件,有参与技术选型吗,实习的项目里为什么选这个RabbitMQ而不是kafka,为什么不用RocketMQ,为什么放弃异步,自己的项目里面使用的是kafka,那你觉得项目和实习的中间件选型有差异的原因是什么,他们之间的区别在哪里,底层的原因知道吗(高柱到这里已经快疯了,但是硬着头皮答完了,主要是从一致性吞吐量和框架的契合度答,面试官说答得挺好的,应该是没什么问题,这一块就问了快半个小时,到这里我已经快疯了2️⃣项目怎么对接上下游3️⃣介绍项目的难点重点4️⃣微服务(高柱实习是单体项目没涉及这一块5️⃣Redis的使用2.项目:1️⃣智能客服是怎么应用在项目里的(langchain4j➕rag➕functioncalling)2️⃣RAG了解多少3️⃣文本向量化的难点是什么,了解哪些大模型的知识(我一点不懂,纯瞎扯,但貌似扯对了4️⃣对ai的态度是什么,aicoding相关5️⃣怎么保证多节点下Caffeine缓存里面数据都是一致的(答的是短ttl,面试官不是很满意,但是我确实不太懂这个怎么保证,后来查了还是不懂怎么保证6️⃣Redis的使用,和你的实习项目的使用有区别吗,还有一些引申问题3.八股(含量不高,就是走个过场1️⃣进程的内存布局2️⃣Redis三剑客3️⃣微服务相关知识(高柱已经忘得差不多了…勉强答上来4️⃣JVM5️⃣线程状态6️⃣线程安全,在你的实习项目里怎么保证线程安全的(又绕回来了4.智商题找异常球5.手撕:1️⃣五道sql,不难2️⃣力扣不重叠的滑动窗口数组,贪心➕双指针秒了强度拉满了这个一面,高柱到后面人都是傻的二面面经:(就半个小时实习拷打,简历上写了几点就问了几点,问完就结束了,无手撕
查看19道真题和解析
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务