leetcode题目(C语言版)
编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,返回空字符串 “”。
自己解决该题的思路是:
1.先找到整个字符串数组中长度最小的那个串。
2.记录找到的那个字符串长度最小的串的长度和其在字符数组中的位置。
3.拿这个长度最小的子串分别和其他的串进行比较(依次比较串中的每个字符)。
4.将比较的结果存在一个数组中,然后进行排序,因为要求得公共子串,所以选择最小的那一个。
注:具体的实现细节看如下的代码。
:在处理字符串时一定要注意字符串数组越界的问的。
char * longestCommonPrefix(char ** strs, int strsSize){
/********************************************
这部分的代码主要完成的工作就是统计字符数组中每个串的长度,并将每个字符串的长度以整形值依 次存放在数组中。
********************************************/
int tmp = 0;
int arr[strsSize];
for (int i =0; i < strsSize; i++)
{
for (int j = 0; (*(strs + i))[j]; j++)
{
tmp++;
}
arr[i] = tmp;
tmp = 0;
}
/********************************************
这部分的代码主要完成了统计完的数组进行排序,并且记录长度最小串的长度以及他所对应的索引号。
尤其是在自函数中,对于用到的变量一般都应该进行初始化,然后再进行使用。
********************************************/
int tmp_min,min,flages;
tmp_min = arr[0];
min = arr[0];
flages = 0;
for (int i = 0; i < strsSize; i++)
{
if (arr[i] < tmp_min)
{
min = arr[i];
flages = i;
}
}
/********************************************
这一部分就是拿找到长度最小的那个字符串依次和字符数组中的每个串的进行比较,
并记录存在公共子串的信息。
********************************************/
int index[strsSize];
int m;
for (int i =0; i < strsSize; i++)
{
m = 0;
//(*(strs + i))[j] && (*(strs + flages))[j]这一句主要是确保每个字符串中的字符
//不是‘/0’。
for (int j = 0; (*(strs + i))[j] && (*(strs + flages))[j]; j++)
{
//这里设计m的意义在于,m是为了统计两个字符串中公共字符的个数。
//如果不用m单独统计,那么也能找到公共的字符个数,但不一定是连续的。
//通过m == j来进行判断,两者相等就意味着每次来的字符如果相等他们必定是连续的。
if (((*(strs + i))[j] == (*(strs + flages))[j]) && (m == j))
{
m++;
}
}
//依次将连续每个字符串中连续的字符个事存储在index[]数组中。
//此时想要找到最长公共子串,只需对该数组进行排序,找到最小的那个值。
index[i] = m;
}
int min_index = index[0];
for (int i = 0; i < strsSize; i++)
{
if (index[i] <= min_index)
min_index = index[i];
}
while (min_index > 0)
{
//这里min_index + 1因为要存min_index个字符,本文要求返回的是一个字符串
//所以应该预留一位置‘\0’。
char str[min_index + 1];
//依次取出长度最小的那个串的前min_index个元素,构成一个字符串。
for (int i =0; i < min_index; i++)
{
str[i] = (*(strs + flages))[i];
}
//字符串结束标记设置
str[min_index] = '\0';
char *ans_ptr = str;
return ans_ptr;
}
//这里需要主要,题目要求返回一个空串“”,如下面这样写才是空串
char *str_1 = "";
return str_1;
}