Prefijo común más largo
Directorio de artículos
Titulo
Escriba una función para encontrar el prefijo común más largo en una matriz de cadenas.
Si no hay un prefijo público, se devuelve la cadena vacía "".
Ejemplo 1:
输入: ["flower","flow","flight"]
输出: "fl"
Ejemplo 2
输入: ["dog","racecar","car"]
输出: ""
解释: 输入不存在公共前缀
Explicación
- Toda entrada contiene solo letras minúsculas az.
Prototipo de función
Prototipo de función C:
char * longestCommonPrefix(char ** strs, int strsSize){}
Juicio de límites
if( strs == NULL || strsSize == 0)
return "";
if(strsSize == 1)
return strs[0];
Diseño de algoritmo: escaneo vertical
Idea: Haga un recorrido, comenzando con la primera palabra, defina un desplazamiento del puntero hacia atrás, si el proceso de desplazamiento del puntero es diferente, regrese, de lo contrario continuará atravesando.
for(int index=0; index<strlen(strs[0]); index++) // 以第一个单词的长度做结束条件
{
char tmp = strs[0][index]; // 记录第一个单词的第 index 个字母, 与后面的字母比较
for(int j=1; j<strsSize; j++){ // 和其它单词比较,不用和自己比了,所以从 1 开始
if( tmp != strs[j][index] || (!strs[j][index]) ){ // 其它单词的第 index 个字母不等于第一个单词第 index 个字母时、或者其它单词的字母已经被遍历完了
strs[0][index] = '\0'; // 返回相同的前缀,但破坏了原数据不太好
return strs[0];
}
}
}
return strs[0]; // 所有单词的所有字母都相等时,返回全部
Código completo:
char * longestCommonPrefix(char ** strs, int strsSize){
if( strs == NULL || strsSize == 0)
return "";
if(strsSize == 1)
return strs[0];
for(int index=0; index<strlen(strs[0]); index++) // 以第一个单词的长度做结束条件
{
char tmp = strs[0][index]; // 记录第一个单词的第 index 个字母, 与后面的字母比较
for(int j=1; j<strsSize; j++){ // 和其它单词比较,不用和自己比了,所以从 1 开始
if( tmp != strs[j][index] || (!strs[j][index]) ){ // 其它单词的第 index 个字母不等于第一个单词第 index 个字母时、或者其它单词的字母已经被遍历完了
strs[0][index] = '\0'; // 返回相同的前缀,但破坏了原数据不太好
return strs[0];
}
}
}
return strs[0]; // 所有单词的所有字母都相等时,返回全部
}
Complejidad de escaneo vertical:
- Complejidad del tiempo:
- Complejidad espacial: