经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » 编程经验 » 查看文章
【算法】LeetCode算法题-Longest Common Prefix
来源:cnblogs  作者:小川94  时间:2018/10/20 15:13:01  对本文有异议

这是悦乐书的第146次更新,第148篇原创

01 看题和准备

今天介绍的是LeetCode算法题中Easy级别的第5题(顺位题号是14),给定一个随机的字符串数组,查找这些字符串元素的公共前缀字符串,如果没有则返回空串。其中,字符串数组中的元素都是由小写字母a-z之间随机组合而成。例如:

输入:["flower","flow","flight"]
输出:"fl"

输入: ["dog","racecar","car"]
输出: ""

输入:["c"]
输出:"c"

本次解题使用的开发工具是eclipse,jdk使用的版本是1.8,环境是win7 64位系统,使用Java语言编写和测试。

02 第一种解法

第一步:获取数组的第一个元素first。

第二步:截取first字符串的0-1位,判断数组从第二个元素到最后一个元素是否都能匹配到截取的字符串,匹配到count就加1,如果count最后的值和数组除掉第一个元素后的长度相等,则是共有前缀。

第三步:如果第二步成功匹配上,则截取first字符串的0-2位,重复第二步的判断逻辑。

  1. public static String longestCommonPrefix(String[] strs) {
  2. String result = "";
  3. if (strs.length == 0) {
  4. return "";
  5. }
  6. if (strs.length == 1) {
  7. return strs[0];
  8. }
  9. String first = strs[0];
  10. for (int i=1; i<=first.length(); i++) {
  11. String prefix = first.substring(0, i);
  12. int count = 0;
  13. for (int j=1; j<strs.length; j++) {
  14. if (strs[j].indexOf(prefix) == 0) {
  15. count = count + 1 ;
  16. }
  17. }
  18. if (count != 0 && count == strs.length-1) {
  19. result = prefix;
  20. }
  21. }
  22. return result;
  23. }

03 第二种解法

第一步:获取数组中第一个元素first。

第二步:用first和数组第二个元素匹配查找,找不到就循环将first元素从0到倒数第二位截取,直到first变为空,如果first为空则表示没有相同的前缀。

第三步:用first和数组第二个元素的共有前缀与数组第三个元素进行匹配查找,依次往后循环。

  1. public static String longestCommonPrefix2(String[] strs) {
  2. if (strs.length == 0) {
  3. return "";
  4. }
  5. String first = strs[0];
  6. for (int i=1; i<strs.length; i++) {
  7. while (strs[i].indexOf(first) != 0) {
  8. first = first.substring(0, first.length()-1);
  9. if (first.isEmpty()) {
  10. return "";
  11. }
  12. }
  13. }
  14. return first;
  15. }

04 第三种解法

先将原数组分为两部分,左边部分依次获取共有前缀,右边部分依次获取共有前缀,再将左右两边的前缀进行查找,最后得到所有元素共有的前缀。此方法有点绕,可以通过调试或做标记及的方式理解。

  1. public String longestCommonPrefix3(String[] strs) {
  2. if (strs.length == 0) {
  3. return "";
  4. }
  5. return partOf(strs, 0, strs.length-1);
  6. }
  7. public String partOf(String[] strs, int leftIndex, int rightIndex) {
  8. if (leftIndex == rightIndex) {
  9. return strs[leftIndex];
  10. } else {
  11. int midIndex = (leftIndex + rightIndex)/2;
  12. String leftStr = partOf(strs, leftIndex, midIndex);
  13. String rightStr = partOf(strs, midIndex+1, rightIndex);
  14. return getResult(leftStr, rightStr);
  15. }
  16. }
  17. public String getResult (String leftStr, String rightStr) {
  18. int min = Math.min(leftStr.length(), rightStr.length());
  19. for (int i=0; i<min; i++) {
  20. if (leftStr.charAt(i) != rightStr.charAt(i)) {
  21. return leftStr.substring(0, i);
  22. }
  23. }
  24. return leftStr.substring(0, min);
  25. }

05 小结

今天这题要解出来不难,难的是这是否是当前的唯一解?是否还可以另寻他法?

如果大家有什么好的解法思路、建议或者其他问题,可以下方留言交流,点赞、留言、转发就是对我最大的回报和支持!

本文首发于我的个人公众号:悦乐书,转载请注明出处!

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号