文章目录
- 字符串(String)
-
- 专题:关于各种最长子串、子序列问题
-
- 300.求最长子序列
- 674.最长递增子串
- size
- substr方法:
- erase方法
- find方法
- 一个疑问????
- 字符范围
- 题目类型
- 例一:把一个0-1串进行排序,可以交换任意连个位置,最少交换的次数?
- 例二:删除一个字符串所有的a,并且复制所有的b。注:字符数组足够大(就在字符串上修改)
- 例三:一个字符串只包含\*和数字,请把它的\*号都放开头
- 例四:给定两个串a和b,问b是否是a的子串的变位词。例如a ="hello",b="lel","lle","ello"都可以,但"elo"不行。
- 例五:单词翻转:翻转句子中的全部单词,单次内容不变。如"I am a student."变为"student.a am I"
- 例六:一个字符串,找出第一个不重复的字符,如“abbbabcd”,则第一个不重复就是c
- 数组
- 例七:n个整数的无序数组,找到每个元素后面比它大的第一个数,要求时间复杂度为O(N)
- 一个数组中有若干正整数,将此数组划分为两个子数组,使得两个子数组各元素之和a,b的差最小,对于非法输入应该输出ERROR。
字符串(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