leetcode腾讯精选练习之最长公共前缀

Posted 一蓑烟雨

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了leetcode腾讯精选练习之最长公共前缀相关的知识,希望对你有一定的参考价值。

最长公共前缀

题目

编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串?""。
示例?1:
输入: ["flower","flow","flight"]
输出: "fl"
示例?2:
输入: ["dog","racecar","car"]
输出: ""
解释: 输入不存在公共前缀。
说明:
所有输入只包含小写字母?a-z?。

思路

思路有两种:

第一种:纵向扫描:
????????1.第一个字符串与余下的所有字符串逐个比较。首先,找出第一个字符串与第二个字符串的最长公共前缀;然后让这个公共前缀和第三个字符串比较找出它们的公共前缀,依次直至遍历完所有的字符串。
????????2.第一个字符串与第二个字符串从头开始比较直到遇到不相同的字符为止,并记录最后一个相同的字符的索引right,然后第一个字符串与第三个字符串从头开始遍历时,如果遍历至索引right处还没遇到不同的字符,则停止遍历,从0到right的字符串即为这三个字符串的最长公共前缀,如果没有遍历至索引right处,就有不同的字符,则更新right的值,直至遍历完所有的字符串。
第二种:横向扫描:
????????1.同时遍历所有的字符串的第i个字符是否与第一个字符串的第i个字符是否相同,如果出现不相同,那么最长公共前缀即到上一个字符为止。

代码

纵向扫描:

string longestCommonPrefix(vector<string>& strs) {
    if(strs.size() <= 0)
    {
        return "";
    }
    int right = strs[0].length();
    for(int i = 1;i < strs.size();i++)
    {
        for(int j = 0; j < right  ; j++)
        {
            if(strs[0][j] != strs[i][j])
            {
                right = j;
                break;
            }
        }

    }
    return strs[0].substr(0,right);
}

横向扫描:

string longestCommonPrefix(vector<string>& strs) {
    if(strs.size() <= 0)
    {
        return "";
    }
    int right = strs[0].length();
    for(int i = 0 ; i < right; i++)
    {
        for(int j = 1 ; j < strs.size(); j++)
        {
            if(strs[j][i] != strs[0][i])
            {
                right = i;
                break;
            }
        }
    }
    return strs[0].substr(0,right);
}

总结

正常思路一般都会是先找出两个字符串的最长公共前缀,在用这个公共前缀和余下的字符串逐一寻找共同的前缀。
横向的思维是在网上看的,需要经常练习。拓宽思路,加油。

以上是关于leetcode腾讯精选练习之最长公共前缀的主要内容,如果未能解决你的问题,请参考以下文章

leetcode腾讯精选练习之相交链表

leetcode腾讯精选练习之旋转链表

leetcode腾讯精选练习之删除链表中的结点

leetcode-14.最长公共前缀(图)

腾讯 2018 秋招精选(50 题)

线性表练习之Example014-比较两个带有最大公共前缀的顺序表