Java LeetCode 14。最长公共前缀
问题: 编写函数以查找字符串数组中最长的公共前缀字符串。如果没有公共前缀,则返回空字符串“” 例1: 输入:[“花”、“流”、“飞行”]Java LeetCode 14。最长公共前缀,java,Java,问题: 编写函数以查找字符串数组中最长的公共前缀字符串。如果没有公共前缀,则返回空字符串“” 例1: 输入:[“花”、“流”、“飞行”] 输出:“fl” 例2: 输入:[“狗”、“赛车”、“汽车”] 输出:“” 说明:输入字符串之间没有公共前缀 代码: 公共类解决方案{ 公共字符串longestCommonPrefix(字符串[]strs){ if(strs==null | | strs.length==0) 返回“”; 对于(int i=0;i您的第一个循环正在对数组第一个字符串中的所有字符执
输出:“fl” 例2: 输入:[“狗”、“赛车”、“汽车”]
输出:“” 说明:输入字符串之间没有公共前缀 代码:
公共类解决方案{
公共字符串longestCommonPrefix(字符串[]strs){
if(strs==null | | strs.length==0)
返回“”;
对于(int i=0;i您的第一个循环正在对数组第一个字符串中的所有字符执行写操作。第二个循环正在检查数组所有字符串的i
posistion处的字符。如果字符不匹配,或者字符串的长度与i
相同,则返回子字符串结果
我认为最好的理解方法是调试这个示例。如果第二个字符串中的字符与第一个字符串中的字符不同,那么返回是正确的,因为这意味着公共前缀结束于此。无需检查第三个和后面的字符串
基本上,只要找到不匹配的字符,它就会返回。您必须检查所有单词中的相同位置,然后进行比较
positions
word 0 1 2 3 4 5
=====================
w[0] F L O W E R
w[1] F L O W
w[2] F L I G H T
在Java中:
class Main {
public static void main(String[] args) {
String[] words = {"dog","racecar","car"};
String prefix = commonPrefix(words);
System.out.println(prefix);
// return empty string
String[] words2 = {"dog","racecar","car"};
String prefix2 = commonPrefix(words2);
System.out.println(prefix2);
// Return "fl" (2 letters)
}
private static String commonPrefix(String[] words) {
// Common letter counter
int counter = 0;
external:
for (int i = 0; i < words[0].length(); i++) {
// Get letter from first word
char letter = words[0].charAt(i);
// Check rest of the words on that same positions
for (int j = 1; j < words.length; j++) {
// Break when word is shorter or letter is different
if (words[j].length() <= i || letter != words[j].charAt(i)) {
break external;
}
}
// Increase counter, because all of words
// has the same letter (e.g. "E") on the same position (e.g. position "5")
counter++;
}
// Return proper substring
return words[0].substring(0, counter);
}
}
主类{
公共静态void main(字符串[]args){
String[]words={“dog”、“racecar”、“car”};
字符串前缀=通用前缀(单词);
System.out.println(前缀);
//返回空字符串
String[]words2={“dog”、“racecar”、“car”};
字符串prefix2=公共前缀(words2);
System.out.println(prefix2);
//返回“fl”(2个字母)
}
私有静态字符串commonPrefix(字符串[]字){
//普通信件柜台
int计数器=0;
外部:
for(int i=0;i 如果(单词[j].length()如果我们先对它们进行排序,那么很容易我们只需要比较向量中的第一个和最后一个元素,
代码就好像,这是C++代码实现的。
class Solution {
public:
string longestCommonPrefix(vector<string>& str) {
int n = str.size();
if(n==0) return "";
string ans = "";
sort(begin(str), end(str));
string a = str[0];
string b = str[n-1];
for(int i=0; i<a.size(); i++){
if(a[i]==b[i]){
ans = ans + a[i];
}
else{
break;
}
}
return ans;
}
};
类解决方案{
公众:
字符串最长通用前缀(矢量和str){
int n=str.size();
如果(n==0)返回“”;
字符串ans=“”;
排序(开始(str),结束(str));
字符串a=str[0];
字符串b=str[n-1];
对于(INTI=0;我仍然感到困惑……如果strs:[“飞行”、“飞行”、“飞行”]为什么返回fl而不是fli?如果不需要第三个和后面的字符串?@beautifuldog如果字符相等,则会检查其他字符串。它会将第一个字符与其他字符串的所有第一个字符进行检查,然后将第二个字符与其他字符串的所有第二个字符进行检查,依此类推,直到找到差异。