题解 | #最长公共前缀#
最长公共前缀
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