zoukankan      html  css  js  c++  java
  • No.014:Longest Common Prefix

    问题:

    Write a function to find the longest common prefix string amongst an array of strings.

    官方难度:

    Easy

    翻译:

    寻找一个字符串数组的最长公共前缀。

    方法一:

    1. 数组长度为0,返回空字符串。
    2. 将数组第一项,作为初始的公共前缀。
    3. 从数组第二项开始进入循换,整理当前字符和当前前缀字符的长度。
    4. 以小长度的字符串为基准,从头开始逐个匹配,遇到不同的字符时,更新前缀字符。
    5. 为防止完全匹配情况,如“aa”匹配“aaa”。由于不存在不同的字符,所以不会更新的情况,设定更新标志位flag,当flag为false时,将前缀字符更新为小长度字符。
    6. 在内循环结束之后,若得到的前缀字符长度为0,直接跳出整个循环。
    7. 外循环可以使用foreach循环。

    方法一的解题代码:

     1     private static String method(String[] strs) {
     2         String prefix = strs.length == 0 ? "" : strs[0];
     3         // 从数组第二项开始遍历
     4         for (String compare : strs) {
     5             // 整理长度
     6             String s1 = prefix.length() > compare.length() ? compare : prefix;
     7             String s2 = prefix.length() > compare.length() ? prefix : compare;
     8             boolean flag = false;
     9             for (int j = 0; j < s1.length(); j++) {
    10                 if (s1.charAt(j) != s2.charAt(j)) {
    11                     prefix = prefix.substring(0, j);
    12                     flag = true;
    13                     break;
    14                 }
    15             }
    16             // 防止完全匹配的情况
    17             if (!flag) {
    18                 prefix = s1;
    19             }
    20             if (prefix.length() == 0) {
    21                 break;
    22             }
    23         }
    24         return prefix;
    25     }
    method

    方法二:

    1. 其实,String类自带了String.startWith()的实例方法,来判断一个字符串是否以另一个字符串为开头的形式。使用这种方法可以进一步地增强效率。
    2. 在内循环中,判断当前字符是否匹配当前前缀,若不是消去前缀字符串的最后一个字符,直到匹配成功。
    3. 注意入参检查。

    方法二的解题代码:

     1     public static String longestCommonPrefix(String[] strs) {
     2         if (strs == null) {
     3             throw new IllegalArgumentException("Input error");
     4         }
     5         String prefix = strs.length == 0 ? "" : strs[0];
     6         for (String compare : strs) {
     7             while (!compare.startsWith(prefix)) {
     8                 // 不匹配,消去前缀最后一项
     9                 prefix = prefix.substring(0, prefix.length() - 1);
    10             }
    11             if (prefix.length() == 0) {
    12                 break;
    13             }
    14         }
    15         return prefix;
    16     }
    longestCommonPrefix

    相关链接:

    https://leetcode.com/problems/longest-common-prefix/

    https://github.com/Gerrard-Feng/LeetCode/blob/master/LeetCode/src/com/gerrard/algorithm/easy/Q014.java

    PS:如有不正确或提高效率的方法,欢迎留言,谢谢!

  • 相关阅读:
    xdoj 1237 (贪心+逆向思维)
    linux系统 (实验一)实验楼的课程笔记
    fc_net.py cs231n
    cnn.py cs231n
    optim.py cs231n
    layers.py cs231n
    Python数据分析与展示[第一周]
    配置了两天python【python可以的】
    PYTHON网络爬虫与信息提取[scrapy框架应用](单元十、十一)
    PYTHON网络爬虫与信息提取[正则表达式的使用](单元七)
  • 原文地址:https://www.cnblogs.com/jing-an-feng-shao/p/5951667.html
Copyright © 2011-2022 走看看