zoukankan      html  css  js  c++  java
  • 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;
    }

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

  • 相关阅读:
    Oracle数据库的dual表的作用
    数据库中CASE函数和Oracle的DECODE函数的用法
    Oracle数据库中,通过function的方式建立自增字段
    Java学习(十三):抽象类和接口的区别,各自的优缺点
    Java学习(十八):二叉树的三种递归遍历
    Sublime工具插件安装
    sizeof和strlen
    I2C接口的EEPROM操作
    关于窗口看门狗
    关于指针传入函数
  • 原文地址:https://www.cnblogs.com/Transkai/p/12372024.html
Copyright © 2011-2022 走看看