昨日刷题,今日补发
解题思路
中间扩展,遍历数组,以每一项为中心,或以每两项为中心,向外拓展。
学习一下pair概念,还有string的substr的用法
以下是leetcode第五题
C++做法
class Solution {
public:pair<int, int> expandAroundCenter(const string& s, int left, int right) {while (left >= 0 && right < s.size() && s[left] == s[right]) {--left;++right;}return {left + 1, right - 1};}string longestPalindrome(string s) {int start = 0, end = 0;for (int i = 0; i < s.size(); ++i) {auto [left1, right1] = expandAroundCenter(s, i, i);auto [left2, right2] = expandAroundCenter(s, i, i + 1);if (right1 - left1 > end - start) {start = left1;end = right1;}if (right2 - left2 > end - start) {start = left2;end = right2;}}return s.substr(start, end - start + 1);}
};
C语言
其实C语言思路与C++类似,因为返回值只有一个,所以,我做题时候没有封装成函数,如果封装成函数,可以仿照pair对组的性质,将left和right封装成结构体
struct index_pair { int left; int right; };
int check(int left, int right, char *s)
{if (left < 0 || right > strlen(s))return 0;if (s[left] == s[right]) {return 1;}return 0;
}char * longestPalindrome(char * s){int slen = strlen(s);int left = 0;int right = 0;int save_left = 0;int save_right = 0;int count_1 = 0;int count_2 = 0;int count_tmp;int count = 0;for (int i = 0; i < slen; i++) {left = i;right = i;while (check(left, right, s)) {left--;right++;}left += 1;right-= 1;count_tmp = right - left + 1;//printf("count tmp = %d\n", count_tmp);if (count < count_tmp) {count = count_tmp;save_left = left;save_right = right;}if (left == slen) {break;}left = i;right = i + 1;while (check(left, right, s)) {left--;right++;}left += 1;right-= 1;count_tmp = right - left + 1;//printf("2. count tmp = %d\n", count_tmp);if (count < count_tmp) {count = count_tmp;save_left = left;save_right = right;}}char *res = (char *)malloc(sizeof(char) * (count + 1));//printf("%d, %d\n", save_left, save_right);strncpy(res, &s[save_left], sizeof(char) * count);res[count] = 0;return res;
}
以下是647题,差不多
int check(int left, int right, char *s)
{if (left < 0 || right > strlen(s))return 0;if (s[left] == s[right]) {return 1;}return 0;
}int countSubstrings(char * s){int slen = strlen(s);int left = 0;int right = 0;int count = 0;for (int i = 0; i < slen; i++) {left = i;right = i;while (check(left, right, s)) {left--;right++;count++;}left = i;right = i + 1;while (check(left, right, s)) {left--;right++;count++;}}return count;
}
pair
pair是将2个数据组合成一组数据,如stl中的map就是将key和value放在一起来保存,或者当一个函数需要返回2个数据的时候,也可以选择pair
pair的实现是一个结构体,主要的两个成员变量first和second,分别存储两个数据, 因为是使用struct不是class,所以可以直接使用pair的成员变量。
pair类型定义在#include 头文件中,也可以使用std命名空间引入对组std::pair
定义如下:
类模板:template<class T1,class T2> struct pair
T1是第一个值的数据类型,T2是第二个值的数据类型。
功能:pair将一对值(T1和T2)组合成一个值,
这一对值可以具有不同的数据类型(T1和T2),
两个值可以分别用pair的两个成员first和second访问。
pair<string, int>p(string("Tom"), 100);cout << "姓名" << p.first << endl;cout << "年龄" << p.second << endl;