c++字符串、数组算法题

文章目录

字符串(String)

专题:关于各种最长子串、子序列问题

300.求最长子序列

class Solution {
   
public:
    int lengthOfLIS(vector<int>& nums) {
   
        if(nums.empty())return 0;
        int len = nums.size();
        vector<int> dp(len,1);
        for(int i =1 ;i<len ;i++)
        {
   
            int temp = 0;
            for(int j =0 ;j<i ;j++)
            {
   
                if(nums[j]<nums[i]) temp = max(temp,dp[j]);
            }
            dp[i] = temp + 1;
        }
        return *max_element(dp.begin(),dp.end());
    }
};

俄罗斯套娃问题就是再这个基础之上做的

class Solution {
   
public:
    static inline bool func(const vector<int>& a, const vector<int>& b)
    {
   
        if(a[0]<b[0])return true;
        if(a[0]==b[0] && a[1]>b[1])return true;
        return false;
    }

    int maxEnvelopes(vector<vector<int>>& envelopes) {
   
        if(envelopes.empty())return 0;
        sort(envelopes.begin(),envelopes.end(),func);
        int len = envelopes.size();
        vector<int> dp(len,1);
        for(int i = 1 ;i< len ;i++)
        {
   
            int temp = 0;
            for(int j = 0; j<i; j++)
            {
   
                if(envelopes[j][1]<envelopes[i][1])temp =max(temp,dp[j]);
            }
            dp[i] = temp + 1;
        }
        return *max_element(dp.begin(), dp.end());
    }
};

674.最长递增子串


class Solution {
   
public:
    int findLengthOfLCIS(vector<int>& nums) {
   
        int n = nums.size();
        if(n<=1) return n;
        int res = 1, len=1;
        for(int i=1; i<n; i++){
   
            if(nums[i] > nums[i-1]) len+=1;
            else len = 1;
            res = max(len, res);//进行比较
        }
        return res;
    }

std::string 可更改,也可以用[]提取字符,和char[]数组使用上区别不大;

size

专门针对stl里用的,char字符串数组用strlen()

substr方法:

substr(n,m) n为起点,m要注意是长度而不是结束点!

erase方法

erase(n,m) n为起点,m要注意是长度而不是结束点!

find方法

find(‘a’)寻找字符a,并返回找到位置,没找到返回-1
find(’’,n)从n开始找

一个疑问????

	string s = "ajoibaivobaoibjoai";
	//int len = s.size();
	int n = s.find('a'); //l = 0
	//cout << typeid(l).name() << endl;
	bool k1 = (-1 < n );//正确
	bool k2 = (-1 < s.find('a'));//错误

n和s.find(‘a’)明明是相等的,为什么将整个放入就不对了??必须定义这一个才行??

字符范围

8位
[-128.127]通常转换为unsigned [0,+255]

题目类型

字典序;
简单操作:插入删除旋转;
规则判断(罗马数字判断、整数合法、浮点数);
数字运算(大数加法、二进制加法);
排序交换(partition过程);
字符计数(hash)变位词;
匹配(正则表达式、全串匹配、KMP、周期判断);
动态规划(LCS、编辑距离、最长回文串);
搜索(单词变换、排列组合);

例一:把一个0-1串进行排序,可以交换任意连个位置,最少交换的次数?

int main()
{
   
	string s = "011001010100101010";
	int len = s.size();
	int i = 0;
	int j = len - 1;
	int num = 0;//维护这个对象

	//s[i];
	//s[j];
	//bool a = (s[i] == '0' );
	while (i < j)
	{
   
		if (s[i] == '1' && s[j] == '0')
		{
   
			swap(s[i], s[j]);
			num = num + 1;
			i = i + 1;
			continue;
		}
		else if (s[i] == '1' && s[j] == '1')
		{
   
			j = j - 1
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值