本篇博客我会讲解力扣中的“14. 最长公共前缀”这道题,这是题目链接。
先来审题:
以下是几个输出示例:
提示:
这道题的思路其实并不难,也是一些字符串的常规操作的结合。大家可以先思考一下,再来听我讲解。
思路是这样的:外层循环遍历第一个字符串的每一个字符,内层循环遍历其他字符串对应位置的字符,直到遍历到不匹配的字符,或者全部匹配。
如何遍历第一个字符串呢?常规思路是这样的:
for (char* cp = str[0]; *cp; ++cp)
{
// ...
}
但是这么写有一个问题:你怎么知道遍历的是第一个字符串中的第几个字符?如果不知道的话,就无法匹配其他字符串相同位置的字符了。
所以,最好用下标来遍历。你可以这么写:
int len = strlen(strs[0]);
for (int i = 0; i < len; ++i)
{
// ...
}
但这么写需要先求字符串的长度,我不太喜欢。我更喜欢这么写:
for (int i = 0; strs[0][i]; ++i)
{
// ...
}
这种写法和第一种写法中的cp指针遍历有着异曲同工之妙,都是遍历到’\0’就停止遍历。
内层循环应该遍历每一个字符串,这就是遍历数组的常规操作。
char * longestCommonPrefix(char ** strs, int strsSize){
// 遍历第一个字符串
for (int i = 0; strs[0][i]; ++i)
{
// 遍历字符串数组
for (int j = 0; j < strsSize; ++j)
{
}
}
}
下面检查每个字符串对应位置的字符是否和第一个字符串对应位置的字符相同,如果相同,就继续遍历;如果不相同,则遍历结束,返回该位置之前的前缀。当然,如果2层for循环都走完了,就说明所有的字符串都是相同的,返回第一个字符串即可。
char * longestCommonPrefix(char ** strs, int strsSize){
// 遍历第一个字符串
for (int i = 0; strs[0][i]; ++i)
{
// 遍历字符串数组
for (int j = 0; j < strsSize; ++j)
{
if (strs[j][i] != strs[0][i])
{
// 遍历结束
strs[0][i] = '\0';
return strs[0];
}
}
}
// 所有字符串均相同
return strs[0];
}
这就通过了。是不是很简单?
总结
- 遍历字符串,除了用cp指针遍历,还可以用下标遍历。
- 返回字符串前缀,可以把前缀的下一个字符改成’\0’,再返回起始地址。
感谢大家的阅读!