一、题目描述
编写一个函数来查找字符串数组中最长的公共前缀字符串。如果没有共同的前缀,则返回一个空字符串“”。
【示例】
Input: ["flower","flow","flight"]
Output: "fl"
Input: ["dog","racecar","car"]
Output: ""
二、解题思路
1、方法一:纵向比较
类深度优先,先遍历所有字符串,从第一个字符串的位置0开始,对每一个位置的字符串对应位置进行匹配,若不匹配则终止遍历
2、方法二:横向比较
类宽度优先 --耗时比方法一长每个字符串与第0个字符串匹配,逐渐缩小第0个字符串的范围,若不匹配则终止遍历,返回第0个子串
三、解题算法
1、方法一:纵向比较
/*************************************************
author:tmw
date:2018-5-4
*************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char* longestCommonPrefix(char** strs, int strsSize)
{
if( strsSize == 0 ) return "";
if( strsSize == 1 ) return strs[0];
int index_str=0;
int i;
char* result = (char*)malloc(strlen(strs[0])*sizeof(char));
int m = 0;/**结果数组的下标记录**/
/**纵向比较:以第一个字符串长度为基准,对每个字符串的每个对应位置进行比较**/
for( index_str=0; index_str<strlen(strs[0]); index_str++ )
{
/**优先遍历每个字符串**/
for( i=1; i<strsSize; i++ )
{
if( strs[0][index_str] != strs[i][index_str] )
{
result[m] = '\0';
return result;
}
}
result[m++] = strs[0][index_str];
}
result[m] = '\0';
return result;
}
2、方法二:横向比较
/**
方法二:横向比较 --- 类宽度优先 --耗时比方法一长
每个字符串与第0个字符串匹配,逐渐缩小第0个字符串的范围,若不匹配则终止遍历,返回第0个子串
**/
char* longestCommonPrefix(char** strs, int strsSize)
{
/**算法入口前判断参数**/
if( strsSize == 0 ) return "";
if( strsSize == 1 ) return strs[0];
int i;
int strs_index = 0;
for( i = 1; i < strsSize; i++ )
{
for( strs_index = 0; strs_index < strlen(strs[0]); strs_index++ )
{
if( strs[0][strs_index] != strs[i][strs_index] )
{
/**每个字符串与第0个字符串匹配,逐渐缩小第0个字符串的范围.**/
strs[0][strs_index] = '\0';
break;
}
}
}
return strs[0];
}
梦想还是要有的,万一实现了呢~~~~ヾ(◍°∇°◍)ノ゙~~~~