-
leetcode地址:链接
-
问题描述:
- 删除 s 中的一些字符,使得它构成字符串列表 d 中的一个字符串,找出能构成的最长字符串。如果有多个相同长度的结果,返回字典序的最大字符串。简言之:找出字符串的最长子串。
- 输入输出:
Input:
s = “abpcplea”, d = [“ale”,“apple”,“monkey”,“plea”]
Output:
“apple”
-
总结下c++编码感受:捋顺基本思路后感觉应该很好实现,但还是在逻辑细节和技术细节上调试改正了很久才跑通,整体来讲对于c++指针使用不熟、二级指针更是容易犯错。
-
实现时遇到的技术点:
- 使用双指针的方法来完成s串和d各串的遍历
- 字符串数组的指针表示:char *arr[]
- sizeof()操作符,内部变量为类型或变量,注意如果变量的值是地址需要注意,如char与char不同,char在64位操作系统中大小为8字节,而char占1个字节。
- 在使用指针进行遍历变量时,注意遍历结束后指针的指向不再是字符串的首地址了,此时不能再用它表示原来的字符串了!如程序中的get_arrlen函数,不能直接使用arr指针遍历。
- 判断好内外层循环的边界条件,比如如何控制 跳出内层循环后不再执行当前外层循环的后续操作。
-
c++代码实现
#include<iostream>
using namespace std;
class Solution
{
public:
char *a;
char **b;
Solution():a(NULL), b(NULL) {}
Solution(char *p1, char **p2) :a(p1), b(p2) {}
int get_arrlen(char *arr)
{
char *p = arr;
int len = 0;
while (*p != '\0')
{
len += 1;
p += 1;
}
return len;
}
char* max_substring(int len_b)
{
char *ptr1 = NULL, *ptr2 = NULL, *max_sub = NULL;
for (int i = 0; i < len_b; i++)
{
ptr1 = this->a;
ptr2 = *(this->b + i);
while (*ptr2 != '\0')
{
if (*ptr1 == '\0')
break;
if (*ptr1 == *ptr2)
{
ptr1 = ptr1 + 1;
ptr2 = ptr2 + 1;
}
else
ptr1 = ptr1 + 1;
}
if (*ptr1 == '\0' && *ptr2 != '\0')
continue;
if(max_sub == NULL)
max_sub = *(this->b + i);
else if(this->get_arrlen(*(this->b + i)) > sizeof(this->get_arrlen(max_sub)))
max_sub = *(this->b + i);
}
return max_sub;
}
};
int main(int argc, char* argv[])
{
char *a = "aapvple";
char *b[] = {"apples", "apple", "ape", "vapl"};
char *res = NULL;
int len_b = sizeof(b)/sizeof(char*);
Solution solution(a, b);
res = solution.max_substring(len_b);
if (res != NULL)
{
for (char* p = res; *p != '\0'; p++)
{
cout << *p;
}
cout << endl;
}
system("pause");
return 0;
}