编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,返回空字符串 ""。
所有输入只包含小写字母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()函数的认识