Java字符串数组[已关闭]

z9zf31ra  于 2022-12-21  发布在  Java
关注(0)|答案(3)|浏览(113)

这个问题似乎与help center中定义的范围内的编程无关。
6天前关闭。
Improve this question
编写一个函数来查找字符串数组中最长的公共前缀字符串。
如果没有公共前缀,则返回空字符串""。
输入:strs = ["flower","flow","flight"]
输出:"fl"

public static String longestCommonPrefix(String[] strs) {

        String common="";

        for(int i=0; i<strs.length-1; i++){
         
          if(strs[i].charAt(i)==strs[i+1].charAt(i)){
              common+=strs[i].charAt(i);
          } else
              return common;  
        }
        return common;
    }

我的代码确实适用于这种情况,但当我尝试只使用两个时,例如,如果我输入

["flower","flow"];

我刚得到f共同。我不知道我错了哪一部分。有人能帮忙吗?

mf98qq94

mf98qq941#

另一个变体是逐个字符而不是使用StartsWith():

public static String longestCommonPrefix(String[] strs) {
    int index = 0;
    String prefix = "";
    String current = "";
    boolean allSame = true;
    
    while (allSame && index < strs[0].length()) {
      current = strs[0].substring(index, index+1);
      for(int i=1; i<strs.length && allSame; i++) {
        allSame = (index < strs[i].length()) && 
                   strs[i].substring(index, index+1).equals(current);
      }
      if (allSame) {
        index++;
        prefix = prefix + current;
      }
    }
    
    return prefix;
  }
2ul0zpep

2ul0zpep2#

public static String commonPrefix(String[] arr) {
    String prefix = "";   // in case arr is empty
    if (arr.length > 0) {
        prefix = arr[0];
    }
     if (arr[i].length () < prefix.length()) {
         prefix = prefix.substring (0, arr[i].length());
     }

    for (int i = 1; i < arr.length && prefix.length() > 0; ++i) {
        for (int j = 0; j < prefix.length() && j < arr[i].length(); ++j) {
            if (arr[i].charAt(j) != prefix.charAt(j)) {
                prefix = prefix.substring(0, j);
                break;
            }
        }
    }
    return prefix;
}

首先假设数组中的第一个元素是公共前缀。然后循环数组的其余部分。它使用嵌套的for循环将prefix与数组中的索引元素进行比较。它逐字符进行比较,直到找到差异。如果/当找到差异时,它缩短prefix
我没有使用startsWith中的一个,而是逐个字符地进行,因为如果startsWith返回false,我将需要额外的代码来为prefix找到更短的长度。
prefix的长度永远不能增加,因此,外部for循环中的继续表达式包含&& prefix.length() > 0,如果prefix的长度已经达到零,则确定没有公共前缀,因此循环不需要继续。

bt1cpqcv

bt1cpqcv3#

请注意下面的代码如何确保检查所有字符串,而不仅仅是连续的字符串:

public static String findCommon(String[] strs) {
    String common = ""; //common prefix (the result)
    String checkedPrefix;
    int index = 0;
    boolean mostCommonPrefix = false; //Flag for when the most common prefix was found

    while (index < strs[0].length() && !mostCommonPrefix) {
        //The checked prefix is our currently most common prefix
        //with 1 more character added from the first string in the array
        checkedPrefix = common + strs[0].charAt(index++);
        for (int i = 1; i < strs.length; i++) {
            //If at least one of our strings doesn't start with the checked prefix
            //then common is our most common prefix
            if (!strs[i].startsWith(checkedPrefix)) {
                mostCommonPrefix = true;
                break;
            }
        }
        //Otherwise we set common to checked prefix (cause all of our strings start with it)
        if (!mostCommonPrefix)
            common = checkedPrefix;
    }

    return common;
}

相关问题