本文共 4967 字,大约阅读时间需要 16 分钟。
Write a function to find the longest common prefix string amongst an array of strings.
写一个函数,找到一个字符串数组中的最长的共有的前缀
If there is no common prefix, return an empty string “”.
如果没有公共前缀,返回一个空的字符串“”
Example 1:
Input: ["flower","flow","flight"] Output: "fl"
Example 2:
Input: ["dog","racecar","car"] Output: "" Explanation: There is no common prefix among the input strings.
Note:
All given inputs are in lowercase letters a-z.
所有的输入字符都是由a-z的26个小写字母构成
#include#include #include char *longestCommonPrefix(char **strs, int sresSize);int main(){ //今日份leetcode char *str1[] = { ""}; printf("%s \n",longestCommonPrefix(str1,1)); return 0;}/* 功能描述:获取所有的字符串的最长的公共子串*/char *longestCommonPrefix(char ** strs, int strsSize){ //创建一个和第一个字符串等长的内存空间 char *result = NULL; result = (char *)malloc(sizeof(strs[0])+1); if(!result) { printf("申请内存失败"); return NULL; } memset(result,0,sizeof(strs[1]) + 1); //从第一个字符串开始遍历 for(int i = 0;i < strlen(strs[0]);i ++) { for(int j = 1;j < strsSize;j ++) { if(strs[0][i] != strs[j][i] && i < strlen(strs[j])) { goto end; } } result[i] = strs[0][i]; }end: return result;}
int IterateStrcmp(char **strs,int strsSize,int middle){ int temp = 0; for(int i = 1;i < strsSize;i ++) { temp = strncmp(strs[0],strs[i],middle); if(temp) { break; } } return temp;}/* 功能描述:采用折半比较法,来快速判定*/char *longestCommonPrefix(char **strs, int strsSize){ //排除空数组的情况 if(strsSize < 1) { return ""; } //单个数组直接返回 if(strsSize == 1) { return strs[0]; } // int end = strlen(strs[0]), temp = 0; for(int i = 1;i < strsSize;i ++) { temp = strlen(strs[i]); if(end > temp) { end = temp; } } int start = 0, middle = end; while(1) { if(!IterateStrcmp(strs,strsSize,middle)) { if((IterateStrcmp(strs,strsSize,middle + 1) || middle == start)||(middle == end)) { break; } else { start = middle; } } else { end = middle; } middle = (start + end) / 2; } //创建一个和第一个字符串等长的内存空间 char *result = NULL; result = (char *)malloc(middle * sizeof(char)+1); if(!result) { printf("申请内存失败"); return NULL; } memset(result,0,middle * sizeof(char)+1); strncpy(result,strs[0],middle); return result;}
char *str1[] = { "asdf","asder","asdcv","asdwe","asdfgh"};
char **strs = { "asdfll","asder","asdcv","asdwe","asdfgh"};
* 原因:当输入的数组为“[]”,不带任何的元素,程序将之有效的排除,所以会出现访问越界,增加如下段代码。
char *longestCommonPrefix(char ** strs, int strsSize){ //排除输入空数组的情况 if(strsSize < 1) { return ""; } //创建一个和第一个字符串等长的内存空间 char *result = NULL; result = (char *)malloc(sizeof(strs[0])+1); if(!result) { ...
//找到数组中长度最短的元素 int min = 0; for(int i = 0;i < strsSize;i ++) { if(strlen(strs[min]) > strlen(strs[i])) { min = i; } }
遍历所有的单词的同一个序号的字母,相同就继续,不同就返回,跟我的暴力破解法相同
转载地址:http://mggpb.baihongyu.com/