第一题:删除回文子序列
题目链接:https://leetcode-cn.com/problems/remove-palindromic-subsequences/
题目描述:
题目要点:
1、子序列不是子串,一开始我误将子序列当成了子串,耽误了很多时间。子序列是不要求字符连续的,所以找到满足条件的子序列要比找到满足条件的子串要容易的多。
2、由于题目只包含两种字符,又需要找回文子序列,所以找的时候只需要找到全a或者全b的情况,不就是一个回文子序列了么。
3、还要注意一中情况,那就是babababab或abababa这种虽然有两个字符,但直接就作为一个回文子序列那一种。需要额外判断。
代码如下:
int removePalindromeSub(string s) {
int num=0;
int one=0, two=0;
int i, j;
int flag=0;
int flag_two=1;
if (s.length() == 0) return 0;//如果字符串里面什么都没有,就返回0.
for (i = 0;i < s.length();i++) {//如果从头到尾都是a或者b,就返回1.
if (!(s[i] == s[s.length() - 1-i]))
{
flag_two = 0;
break;
}
}
if (flag_two == 1) return 1;
for (i = 0;i < s.length();i++) {//找ababa这种情况
if (s[i] == 'a' && flag == 0) {
one++;
flag = 1;
}
else if (s[i] = 'b' && flag == 1) {
one++;
flag = 0;
}
}
if (flag == 0) one--;//如果最后一个并不是以a收尾,说明并不构成回文串,但又具有两种字符
for (i = 0;i < s.length();i++) {{//找babab这种情况
if (s[i] == 'b' && flag == 0) {
two++;
flag = 1;
}
else if (s[i] == 'a' && flag == 1) {
two++;
flag = 0;
}
}
if (flag == 0) two--;//如果最后一个并不是以b收尾,说明并不构成回文串,但又具有两种字符
if (one == s.length() || two == s.length())//如果刚刚好是回文串,就返回1
return 1;
else return 2;//不是回文串,就返回2
}
时候对比了下评论区的答案,心情有点沉重
无论全a还是全b还是ababa还是babab不都是回文么我分开来判断干嘛!
int removePalindromeSub(char * s){
int length=strlen(s);
if(length==0)
return 0;
int low=0,high=length-1;
while(low<high)//缩减
{
if(s[low]!=s[high])
return 2;
low++;
high--;
}
return 1;
}
第二题:餐厅过滤器
题目链接:https://leetcode-cn.com/problems/filter-restaurants-by-vegan-friendly-price-and-distance/
题目描述:
题目要点:无
好直接不拐弯抹角的题目,写个交换函数就行了。
代码如下:
void sort_vector(vector<int>& a, vector<int>& b) {
vector<int> temp;
if (a[1] > b[1])
{
temp = b;
b = a;
a = temp;
}
else if (a[1] == b[1])
{
if (a[0] > b[0])
{
temp = b;
b = a;
a = temp;
}
}
}
vector<int> filterRestaurants(vector<vector<int>>& restaurants, int veganFriendly, int maxPrice, int maxDistance) {
int i,j;
int n = restaurants.size();
vector<vector<int>> filter;
vector<int> number;
if (veganFriendly == 1)
for (i = 0;i < n;i++)
if(restaurants[i][2]==1&& restaurants[i][3]<=maxPrice&& restaurants[i][4]<=maxDistance)//如果满足素食
filter.push_back(restaurants[i]);
else
for (i = 0;i < n;i++)
if (restaurants[i][3] <= maxPrice && restaurants[i][4] <= maxDistance)
filter.push_back(restaurants[i]);
for (i = 0;i < filter.size();i++)
for (j = 0;j < filter.size();j++)
sort_vector(filter[i],filter[j]);
for (i = 0;i < filter.size();i++)
number.push_back(filter[i][0]);
return number;
}
由于题目逻辑很简单,所以与网上的代码相比,也只是排序的先后顺序有差别。
网上的答案使用了sort自定义cmp函数。