题解 | #最长公共前缀#

最长公共前缀

https://www.nowcoder.com/practice/28eb3175488f4434a4a6207f6f484f47

import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param strs string字符串一维数组
     * @return string字符串
     */
    public String longestCommonPrefix (String[] strs) {
        // write code here
        /**
         找到最短的字符串,用最短字符串去匹配每一个字符串。先用完整的最短字符串,有不匹配的就把最短字符串改为总长度-1的字符串继续匹配。(但是觉得这个思路比较复杂?)这个思路就是纵向方法,只不过比一般的纵向多了一步找最短
        但是有个问题是,不会写。所以参考了gpt
         */

         //首先,判断不合适的条件,比如字符串数组为空或长度小于2
         if(strs == null || strs.length == 0){
            return "";
         }else{
            if(strs.length < 2) return strs[0];
         }

         //遍历找到最短
         String short_word  = strs[0];   //注意不要用short,short是关键字
         for(int i = 0; i < strs.length; i++){
            if(strs[i].length() < short_word.length()){
                short_word = strs[i];
            }
         }

        //用最短去匹配// 检查最短字符串与其他字符串的公共前缀
	  //假设最短字符串是ab,那么只需要比较所有字符串的前两个里面有没有不一样的
	  //当i等于0,c = a,然后去内循环,遍历字符串每一个字符串,比较这个字符串的第0个字母和c是不是一样。如果一样就比较ab里面第二个字符,是不是和其他字符串的第二个字符相等。找到不一样的,返回最短字符串的第0到i个字符,那么就肯定是一样的前缀。(纵向比较)
        for (int i = 0; i < short_word.length(); i++) {  //遍历最短字符串并转化为char
            char c = short_word.charAt(i);
            for (int j = 0; j < strs.length; j++) {
                if (strs[j].charAt(i) != c) {
                    // 出现不匹配,返回最长公共前缀
                    return short_word.substring(0, i);
                }
            }
        }

    return short_word;

    }
}

找到最短字符串之后,最短前缀肯定是小于等于最短字符串。所以只需要遍历最短字符串的长度,拆分出最短字符串第一个字符和其他字符串第一个字符比较,最短字符串第二个字符和其他字符串第二个字符比较。不相等就返回之前相等的。

牛客HOT101 文章被收录于专栏

牛客HOT101

全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务