• 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;
    }

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

  • 相关阅读:
    safari 扩展配置访问指定站点 allows domains 记录
    tomcat windows启动错误,错误代码4
    iOS实现组件录屏视频不可见,用户肉眼可见(类似系统键盘效果)
    YogaKit.modulemap not found react iOS Xcode
    smoothsignature 使用经验
    CHM文件的打开问题
    如何根据基本类型(值类型)动态生成对象
    怎么根据基本类型的名字字符串,判断一个值是否在一个范围内
    使用腾讯云 EKS 部署 WordPress
    Fastdfs 部署与使用
  • 原文地址:https://www.cnblogs.com/Transkai/p/12372024.html
Copyright © 2020-2023  润新知