leetcode524-最长子序列、双指针、c

思路:

//给定字符串s删除一些字符能得到数组的字符串
//找最长的字符串
//如果长度相同选字典顺序最小的字符串
比较s和p指针遍历指向的字符串是否对应相等
如果p指向字符串是s的子串
并且p字符串更长,或者长度同但p字典序更小
就将迄今已匹配最长字符串更新为p指向的字符串
最后p将数组所有字符串都遍历完成时,lonestword就是最匹配的字符串

全代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char * findLongestWord(char * s, char ** d, int dSize) {/*char*型的指针变量调用s,char**型的二维指针变量调用d*/
	char * longestword = "";           /*定义了一个字符指针变量,初始指向"",用来存放迄今已匹配最小最长字符串*/
	int longwolen = -1;                /*定义longwolen表示迄今已匹配的最长字符串长度*/
	for (int i = 0; i < dSize; ++i) {  /*遍历字符串数组*/
		char * p = d[i];               /*指针数组(是数组):存放数组i位置的字符串,每个d[i]相当于一个一维指针*/
		int j = 0, k = 0;              /*j为s的循环下标,k为p的循环下标*/
		while (s[j] != '\0' && p[k] != '\0') {/*c语言字符串默认末尾为'\0',不为'\0'就是没到末尾,即两个字符串中的字符没有都遍历完成*/
			if (s[j] == p[k]) {        /*如果两个指针指向的元素相同,就将遍历字符串的指针向后移*/
				++k;                   /*如果两个指针指向的元素相同,就将下标同时向后移,检测下一位*/
			}
			++j;                       /*否则用s下一个位置j+1的字符与p当前位置k的字符循环比较*/
		}
		if (p[k] == '\0') {            /*如果q遍历字符串匹配成功,则下标会跳到'\0'这里,此时遍历字符串是s的子串*/
			if (k > longwolen) {       /*如果k比之前已经匹配的字符串更长*/
				longwolen = k;         /*就更新已匹配的最长字符串的长度*/
				longestword = p;       /*将p这个字符串赋值给字符串longestword*/
			}
			else if (k == longwolen) { /*如果k和当前的字符串长度相同的话*/
				if (strcmp(p, longestword) < 0) {/*strcmp为字符串比较函数,按照字典序大小比较,返回值小于0说明q比longestword小,等于为相等,大于0为q>longestword*/
					longestword = p;   /*将q指向的这个字符串赋值给longestword,作为迄今已匹配最长字符串*/
				}
			}
		}
	}
	return longestword;
}

int main()
{
	int i, dSize;
	char s[50];
	char ** d = NULL;                             /*二维指针变量初始化为空,指针使用前都要初始化*/
	printf("请输入一个字符串:\n");
	scanf("%s", s);
	printf("请输入数组长度:\n");
	scanf("%d", &dSize);
	printf("请输入%d个字符串:\n", dSize);
	d = (char**)malloc(dSize * sizeof(char*));   /*malloc会返回一个分配了dSize个char*类型存储单元的指针,这个指针是void*型,(char**)用来强制类型转换,将void*型的指针强制转换成char**型,然后赋值给同是char**型的变量d*/
	getchar();                                   /*前面有scanf的操作,以\n输入结束,我们待会要用gets,而gets会识别\n作为输入结束标志,所以要先用getchar接收前面的\n,然后gets才能正常接收字符,不然前面\n就会被gets当作一个字符串接收了*/
	for (i = 0; i < dSize; i++) {
		d[i] = (char*)malloc(50 * sizeof(char)); /*同上面,将一个分配了50个char型存储单元的char*型的指针赋值给d[i],d[i]相当于一个一维指针*/
		gets(d[i]);                              /*接收的字符串放在d[i]中*/
	}
	printf("%s", findLongestWord(s, d, dSize));  /*将函数返回的字符串直接输出,将s(可理解为字符数组首地址),d的地址(字符串数组首地址),字符串个数作为参数传入*/
	return 0;
}

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值