Leet Code 14.最长公共前缀

编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,返回空字符串 ""。

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

思路

不断比较每个字符串的单个字符,若相等则用加入StringBuilder,直到不相等。

提交代码

import java.util.*;
import static java.lang.Math.min;

public class leetcode {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int n = scan.nextInt();
        String str1 = scan.nextLine();
        String[] str = new String[n];
        for(int i = 0; i < n; i++) {
            str[i] = scan.nextLine();
        }
        String result = longestCommonPrefix(str);
        System.out.println(result);
    }

    public static String longestCommonPrefix(String[] str) {
        StringBuilder str_result = new StringBuilder();
        if(str.length == 0) return "";
        int length = str[0].length();
        for(int i = 1; i < str.length; i++)
            length = Math.min(length, str[i].length());
        for(int i = 0; i < length; i++) {
            boolean same = true;
            char first = str[0].charAt(i);
            for(int j = 1; j < str.length; j++) {
                if(str[j].charAt(i) != first) {
                    same = false;
                    break;
                }
            }
            if(same == true) {
                str_result = str_result.append(first);
            }
            else {
                break;
            }
        }
        return str_result.toString();
    }
}

其他人的解法

水平扫描

String字符串有一个indexOf(String str)方法。查找指定字符或字符串在字符串中第一次出现地方的索引,未找到的情况返回 -1.

public String longestCommonPrefix(String[] strs) {
   if (strs.length == 0) return "";
   String prefix = strs[0];
   for (int i = 1; i < strs.length; i++)
       while (strs[i].indexOf(prefix) != 0) {
           prefix = prefix.substring(0, prefix.length() - 1);
           if (prefix.isEmpty()) return "";
       }        
   return prefix;
}
将第一个字符串与第二个字符串比较,相同的字符串再与第三个字符串比较。
while循环:如果index返回不是0,说明第二个字符串没有第一个字符串,那么就把第一个字符串减少,直到返回0,说明第二个字符串有开头相同的。如果prefix为 "",说明第一个第二个字符串没有相同的,可以直接结束。

这个思路很好,主要点是对indexOf()函数的认识

posted @ 2020-04-02 11:02  Tanglement  阅读(102)  评论(0编辑  收藏  举报