LeetCode 7.找出字符串的最长公共前缀

题目描述

题目难度:简单

编写一个函数来查找字符串数组中的最长公共前缀。

如果不存在公共前缀,返回空字符串 ""。

示例 1:

输入: ["flower","flow","flight"]
输出: "fl"
示例 2:

输入: ["dog","racecar","car"]
输出: ""
解释: 输入不存在公共前缀。
说明:

所有输入只包含小写字母 a-z 。

解题思路

暴力破解法:

n个指针指向n个字符串的首字母,如果这n个指针指向的字母是相同的,则各个指针走一步,如果是不相同的,则记录下第一个字符串的指针的下标,再截取第一个字符串的subString(0,指针下标)

那么如何判断各个指针指向的字母是否相同呢,可以使用一个set,将这n个指针指向的字母都add进set中,判断该set是否size>1,如果大于1,则表示有不相同的字母

代码如下

class Solution {

public String longestCommonPrefix(String[] strs) {
        int length=strs.length;
       if (length==0) {
            return "";
        }
       if(length==1){
           return strs[0];
       }
        int[] lengths=new int[length];
        String string="";
        lengths[0]=0;

        for (int i = 1; i < strs.length; i++) {
            lengths[i]=strs[i-1].length()+lengths[i-1];
            
        }
        for (int i = 0; i < strs.length; i++) {
            
            string+=strs[i];
        }
       if(string.equals("")||string.length()==1){
           return "";
       }
       int minLength=Integer.MAX_VALUE;
     for (int i = 0; i < strs.length; i++) {
        minLength=Math.min(minLength, strs[i].length());
    }
        Set<Character> set=new HashSet<>();
        boolean flag=true;
        int count=0;
        while (flag) {
             
            for (int i = 0; i <= lengths.length-1; i++) {
                if (lengths[i]>string.length()-1) {
                    return string.substring(0,count);
                }
                set.add(string.charAt(lengths[i]));
            }
            if (set.size()>1) {
                break;
            }else {
                set.clear();
                add1(lengths);
                count++;
                if (count>=minLength) {
                    return string.substring(0,minLength);
                }
            }
            
        }

         return string.substring(0,count);
            
        }

    private void add1(int[] lengths) {
        for (int i = 0; i < lengths.length; i++) {
            lengths[i]+=1;
        }
        
    }
}

其他解题思路


当字符串数组长度为 0 时则公共前缀为空,当字符串数组长度为1时,则公共前缀为strs[0]。可直接求出结果。
令最长公共前缀 为res,并进行初始化为第一个字符串。
遍历后面的字符串,依次将其与 为res 进行比较,两两找出公共前缀,最终结果即为最长公共前缀。
如果查找过程中出现了res为空或者strs[i]为空的情况,则公共前缀为空串,直接返回。
时间复杂度:O(n)。

代码如下

public String longestCommonPrefix(String[] strs) {
if (strs.length == 0) {
return "";
}
if (strs.length == 1) {
return strs[0];
}
String res = strs[0];
for (int i = 1; i < strs.length; i++) {
String str = strs[i];
if (str.equals("") || res.equals("")) {
return "";
}
int start = 0;
while (start < res.length() && start < str.length() && str.charAt(start) == res.charAt(start)) {
start++;
}
res = res.substring(0, start);
}
return res;
}

所以说为什么要学算法,为什么要优化算法,对比两种思路即可得出其间差距。

原文地址:https://www.cnblogs.com/Transkai/p/12372024.html