• Leetcode(14) - Longest Common Prefix


      这道题要求给你一组字符串数组strs[],找到整个数组的所有字符串里最长的前缀,如(["abc","abde,"abcad"],最长的前缀是"ab"])。

      这题比较简单,思路是这样子:一开始,把strs[0]当成是最长的前缀prefix,然后从strs[1]开始遍历,找到strs[0]和strs[1]前面公共部分,更新prefix,然后继续遍历,直到整个数组遍历完毕或者prefix的长度为0为止。

      找公共部分可以利用Java里s1.indexOf(s2)方法,如果s2是s1的子字符串,则会返回s2在s1里第一次出现的位置(不是子字符串返回-1),所以如果要判断s2是不是s1的前缀,只要看s1.indexOf(s2)返回是不是0就好,如果不是,则s2上截掉最后一个字符,继续匹配,直到匹配到为0为止。

      因为String是不可以截掉字符的,所以我生成StringBuilder对象来代表prefix而不是String,这样就可以利用StringBuilder里的prefix.deleteCharAt(index)的方法来删除字符了。

      代码如下:

     1 public class Solution {
     2     public String longestCommonPrefix(String[] strs) {
     3         if (strs.length == 0) return "";
     4         StringBuilder sb = new StringBuilder(strs[0]);
     5         for (int i = 1; i < strs.length;i++) {
     6             while (sb.length() > 0 && (strs[i].indexOf(sb.toString()) != 0)) {
     7                 sb.deleteCharAt(sb.length() - 1);
     8             }
     9             if (sb.length() == 0) break;
    10         }
    11         return sb.toString();
    12     }
    13 }

      有人可能要问,如果不用indexOf方法可不可以做,当然可以。你需要做的就是在每一个循环里,从头开始一个一个字符匹配prefix和待验字符串,然后纪录相同字符长度,最后把prefix从第一个不相同的字符出现的位置开始删掉。删掉的工作仍然是由StringBuilder来完成。

      代码如下:

     1 //思路:运用StringBuilder来一一比对。
     2 public class Solution {
     3     public String longestCommonPrefix(String[] strs) {
     4             int length = strs.length;
     5             if (length == 0) return "";
     6             StringBuilder prefix = new StringBuilder();
     7             prefix.append(strs[0]);
     8             for (int i = 1; i < length; i++) {
     9                 int strLength = strs[i].length();
    10                 int prefixLength = prefix.length();
    11              //待比较的长度取决于prefix的长度和待验字符串的长度的较小者
    12                 int compareLength = prefixLength <= strLength? prefixLength : strLength;
    13                 int j;
    14                 for (j = 0; j < compareLength; j++) {
    15                 //找到第一个不相同的就break;
    16                     if (prefix.charAt(j) != strs[i].charAt(j)) {
    17                         break;
    18                     }
    19                 }
    20             //删掉所有j和prefixLength-1之前的字符。
    21                 prefix.delete(j,prefixLength);
    22                 if (prefix.length() == 0) break;
    23             }
    24             return prefix.toString();
    25     }
    26 }
  • 相关阅读:
    协程方法的开启、关闭以及传参
    五种访问修饰符
    多态之虚方法、抽象类、接口
    递归算法
    继承之构造方法
    鼠标相关操作(Cursor类及相关API)
    遇到的问题(七)
    遇见的问题(六)
    遇见的问题(五)
    函数VS对象
  • 原文地址:https://www.cnblogs.com/kepuCS/p/5244061.html
Copyright © 2020-2023  润新知